簡體   English   中英

僅用於單例的動態代理生成?

[英]Dynamic proxy generation only for singletons?

我正在使用Castle Dynamic ProxyStructureMap進行日志攔截器的實現,因此在我的依賴項注冊表中,我告訴StructureMap用LoggingInterceptor裝飾TrafficSourceRepository的所有實例。

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

在此處輸入圖片說明

一切似乎都很好,它可以工作,但是TrafficSourceRepository將被實例化為Singleton ,並且我不想這樣做,因此我將已解析的TrafficSourceRepositories的生存期更改為Transient

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

而且它不再起作用了……這是一個錯誤,或者我做錯了什么?

這不是一個答案,但我無法對此置評。 這是一個最小的示例,顯示它可以與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);
        }
    }
}

輸出:

Called
Intercepted: Ex

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM