C# .net MVC控制器使用Ninject进行拦截

C# .net MVC控制器使用Ninject进行拦截,c#,asp.net-mvc,ninject,interception,ninject-interception,C#,Asp.net Mvc,Ninject,Interception,Ninject Interception,我有MVC4项目和Ninject 3项目都连接好了 现在我想处理MVC控制器方法上的拦截 如果我加上: kernel.Bind<TT.Controllers.HomeController>().ToSelf().Intercept().With<TT.Interceptors.LoggingInterceptor>(); ninject拦截扩展使用Linfu或Castle动态代理进行拦截,只能拦截虚拟方法,如果是接口代理,则拦截接口的所有方法。您应该了解castle d

我有MVC4项目和Ninject 3项目都连接好了

现在我想处理MVC控制器方法上的拦截

如果我加上:

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

ninject拦截扩展使用Linfu或Castle动态代理进行拦截,只能拦截虚拟方法,如果是接口代理,则拦截接口的所有方法。您应该了解castle dynamic proxy各种代理对象概述

然而,另一个限制是,只截取外部调用的方法。如果该方法是由它自身的对象调用的,则拦截不起作用

例如,如果您有:

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

    public virtual void ReallyDoIt()
    {

    }
}

Foo f;
f.Bar();
然后执行kernel.Get.Bar;代理将截获Bar,但不会截获ReallyDoIt


正如您所描述的,我认为您的基本控制器类正在调用doSomethingOnEnter和doSomethingOnExit方法。如前所述,这是行不通的。

我认为这里的诀窍是在IController上应用拦截器,而不是任何具体的控制器。您可能需要实现并注册一个自定义控制器工厂来实现此功能。
kernel.InterceptAround<UrlService>(
                    c => c.DoSomething(),
                    invocation => doSomethingOnEnter(invocation),
                    invocation => doSomethingOnExit(invocation)
                    );
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(TT.NinjectWebCommon), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(TT.NinjectWebCommon), "Stop")]
public class Foo
{
    public virtual void Bar()
    {
        this.ReallyDoIt();
    }

    public virtual void ReallyDoIt()
    {

    }
}

Foo f;
f.Bar();