.net MVC控制器拦截Ninject

时间:2014-09-25 10:21:02

标签: c# asp.net-mvc ninject interception ninject-interception

我有MVC 4项目和Ninject 3都已连线。

现在我想处理我的MVC Controller方法的拦截。

如果我加上这个:

kernel.Bind<TT.Controllers.HomeController>().ToSelf().Intercept().With<TT.Interceptors.LoggingInterceptor>();

它有点工作(即使我自己的方法没有被拦截,但我得到了截取基础Controller类的BeginExecute,EndExecute和Dispose方法)。但是,让我们说现在还可以。

如果我想截取我的HomeController上的特定方法,请执行以下操作:

kernel.InterceptAround<TT.Controllers.HomeController>(
                c => c.Index(),
                invocation => doSomethingOnEnter(invocation),
                invocation => doSomethingOnExit(invocation)
                );

它根本不起作用。拦截永远不会被解雇。

另一方面,如果我在项目中的某些普通服务类上使用相同的方法拦截,那么它可以工作。似乎只有控制器方法有被拦截的问题。

kernel.InterceptAround<UrlService>(
                    c => c.DoSomething(),
                    invocation => doSomethingOnEnter(invocation),
                    invocation => doSomethingOnExit(invocation)
                    );

^这有效。

有没有人知道我应该怎么做?

PS。我正在将NinjectWebCommon与WebActivators一起使用:

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(TT.NinjectWebCommon), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(TT.NinjectWebCommon), "Stop")]

1 个答案:

答案 0 :(得分:0)

ninject拦截扩展,使用Linfu或Castle Dynamic Proxy进行拦截,只能在接口代理的情况下拦截虚拟的方法,接口的所有方法。您应该查看this城堡动态代理“各种代理对象”概述。

然而,进一步的限制是,只有截获的方法被称为外部方法。如果该方法由对象自己调用,则拦截不起作用。

例如,如果你有:

public class Foo
{
    public virtual void Bar()
    {
        this.ReallyDoIt();
    }

    public virtual void ReallyDoIt()
    {

    }
}

Foo f;
f.Bar();

你做kernel.Get<Foo>().Bar();代理会截取Bar() ReallyDoIt()

正如您所描述的那样,我认为您的基本控制器类正在调用doSomethingOnEnterdoSomethingOnExit方法。如前所述,这不起作用。