2017-03-01 4 views
0

Je travaille sur une implémentation de l'intercepteur de journal en utilisant Castle Dynamic Proxy et StructureMap, donc dans mon registre de dépendances je dis à StructureMap de décorer toute instance de TrafficSourceRepository avec un LoggingInterceptor.Génération de proxy dynamique uniquement pour les singletons?

var proxyGenerator = new ProxyGenerator(); 
For<ITrafficSourceRepository>(Lifecycles.Singleton) 
    .DecorateAllWith(instance => proxyGenerator 
    .CreateInterfaceProxyWithTargetInterface(instance, 
    new LoggingInterceptor(LogManager.GetLogger("AgencyPlayground")))) 
.Use<TrafficSourceRepository>(); 

enter image description here

Tout semble bien, cela fonctionne, mais le TrafficSourceRepository sera instancié comme Singleton, et je ne veux pas, donc je changer la durée de vie des TrafficSourceRepositories résolus comme Transient :

var proxyGenerator = new ProxyGenerator(); 
    For<ITrafficSourceRepository>(Lifecycles.Transient) 
     .DecorateAllWith(instance => proxyGenerator 
     .CreateInterfaceProxyWithTargetInterface(instance, 
     new LoggingInterceptor(LogManager.GetLogger("AgencyPlayground")))) 
    .Use<TrafficSourceRepository>(); 

et il ne fonctionne plus ... il est un bug ou que je fais quelque chose de mal?

+0

En ne vous dire fonctionne pas LoggingInterceptor est pas appelé? – Evk

+0

oui, si je change la durée de vie en transitoire, l'intercepteur n'intercepte pas – InferOn

+0

En utilisant le code exact que vous avez posté je ne peux pas le reproduire: avec l'intercepteur transitoire lifecycle est toujours appelé. Alors peut-être que vous devriez fournir un exemple de travail minimal pour reproduire cela. – Evk

Répondre

2

Ceci n'est pas une réponse mais je ne peux pas l'insérer dans un commentaire. Voici un exemple minimal montrant que cela fonctionne très bien avec Lifecycles.Transient:

class Program { 
    public static void Main() { 
     var proxyGenerator = new ProxyGenerator(); 
     var container = new Container(config => { 
      config.For<ITrafficSourceRepository>(Lifecycles.Transient) 
       .DecorateAllWith(instance => proxyGenerator 
        .CreateInterfaceProxyWithTargetInterface(instance, 
         new LoggingInterceptor())) 
       .Use<TrafficSourceRepository>(); 
     }); 
     var ts = container.GetInstance<ITrafficSourceRepository>(); 
     ts.Call(); 
     Console.ReadKey(); 
    }   
} 

public interface ITrafficSourceRepository { 
    void Call(); 
} 

public class TrafficSourceRepository : ITrafficSourceRepository { 
    public void Call() { 
     Console.WriteLine("Called"); 
     throw new Exception("Ex"); 
    } 
} 

public class LoggingInterceptor : IInterceptor { 
    public void Intercept(IInvocation invocation) { 
     try { 
      invocation.Proceed(); 
     } 
     catch (Exception ex) { 
      Console.WriteLine("Intercepted: " + ex.Message); 
     } 
    } 
} 

Sortie:

Called 
Intercepted: Ex 
+0

J'utilisais une ancienne version de StructureMap et StructureMap pour MVC5, j'ai mis à jour les paquets vers la dernière version et maintenant ça marche ... – InferOn

+0

Content que ça soit résolu maintenant – Evk