Ninject拦截 - 多次调用CreateInterceptor

时间:2012-03-05 14:57:24

标签: ninject ninject-interception

我正在使用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实现,但我看到了同样的问题。

0 个答案:

没有答案