2017-03-01 5 views
0

Ich arbeite an einer Implementierung von Log-Abfangjäger mit Castle Dynamic Proxy und StructureMap, so in meiner Abhängigkeit Registry ich StructureMap sagen alle Instanz von TrafficSourceRepository mit einem LoggingInterceptor zu dekorieren.Dynamische Proxy-Generierung nur für 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

Alles scheint in Ordnung zu sein, es funktioniert, aber die TrafficSourceRepository wird als Singleton instanziiert werden, und ich will nicht, so dass ich ändern, um die Lebensdauer der aufgelösten TrafficSourceRepositories als Transient :

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

und es mehr funktioniert nicht ... es ein Fehler ist, oder ich etwas falsch mache? Diese

+0

von nicht funktioniert meinen Sie LoggingInterceptor nicht aufgerufen wird? – Evk

+0

ja, wenn ich die Lebensdauer zu transient ändern, fängt der Interceptor nicht ab – InferOn

+0

Unter Verwendung von genauem Code, den Sie gepostet haben, kann ich es nicht reproduzieren: mit Lifecycle Transient Interceptor wird immer noch genannt. Also solltest du vielleicht ein minimales Arbeitsbeispiel liefern um das zu reproduzieren. – Evk

Antwort

2

ist keine Antwort, aber ich kann es nicht in Kommentar passen. Hier ist ein minimales Beispiel dafür, dass es funktioniert gut mit 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); 
     } 
    } 
} 

Ausgang:

Called 
Intercepted: Ex 
+0

Ich benutzte eine alte Version von StructureMap und StructureMap für MVC5, ich aktualisierte die Pakete auf die neueste Version und jetzt funktioniert es ... – InferOn

+0

Gut, dass es jetzt gelöst ist – Evk