[英]Dynamic proxy generation only for singletons?
我正在使用Castle Dynamic Proxy和StructureMap進行日志攔截器的實現,因此在我的依賴項注冊表中,我告訴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.