我正在使用Ninject Interception Extension并设置了一个属性类,如下所示:
public class TransactionAttribute : InterceptAttribute
{
public override IInterceptor CreateInterceptor(IProxyRequest request)
{
Debug.WriteLine("##################### CreateInterceptor ####################### " + request.Target.GetHashCode() + " " + request.Target.GetType().Name);
return new TransactionInterceptor();
}
}
拦截器如下:
public class TransactionInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
var service = invocation.Request.Target as ServiceBase;
try
{
Debug.WriteLine("##################### BEGIN ####################### " + service.GetHashCode());
service.TransactionManager.Begin();
invocation.Proceed();
Debug.WriteLine("##################### COMMIT ####################### " + service.GetHashCode());
service.TransactionManager.Commit();
}
catch (Exception ex)
{
Debug.WriteLine("#################### ROLLBACK ###################### " + service.GetHashCode());
service.TransactionManager.Rollback();
throw;
}
}
}
在我的绑定中,我绑定了许多类,如下所示:
this.Bind<TicketHandler>().ToSelf().OnActivation(c => Debug.WriteLine("##################### Activating TicketHandler"));
预期的Debug输出应该是如下模式:
##################### Activating CloseActivityHandler
##################### CreateInterceptor ####################### 28138265 CloseActivityHandler
##################### BEGIN ####################### 28138265
##################### POST ####################### 28138265
##################### COMMIT ####################### 28138265
这正是我在调试会话期间为前几次调用看到的内容。但后来我开始看到多次调用CreateInterceptor,这导致对原始截获方法的每次调用多次调用拦截器。例如:
##################### Activating CloseActivityHandler
##################### CreateInterceptor ####################### 28138265 CloseActivityHandler
##################### CreateInterceptor ####################### 28138265 CloseActivityHandler
##################### BEGIN ####################### 28138265
##################### BEGIN ####################### 28138265
##################### POST ####################### 28138265
##################### COMMIT ####################### 28138265
<Exception thrown by second commit>
一旦这个模式开始,它会逐渐变得更糟,因为每次调用CreateInterceptor的次数增加一次。通过调试 - 我可以看到,在每种情况下,invocation.Request.Target指向同一个对象实例,因此不是包装包装器 - 看起来多个拦截器与同一个对象相关联。
如果我在调试器中捕获对CreateInterceptor的任何调用,则堆栈跟踪在所有情况下都从DynamicProxyWrapper.Intercept开始。在此之前,堆栈指向外部代码。
我在ASP.NET开发服务器(Cassini)中运行我的Web应用程序。 Ninject 2.2.0.0。我也尝试了LinFu实现,但我看到了同样的问题。