0

我已经连接了 MVC 4 项目和 Ninject 3。

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

如果我添加这个:

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)
                );

它根本行不通。拦截永远不会被解雇。

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

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")]
4

1 回答 1

0

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

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

例如,如果您有:

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

    public virtual void ReallyDoIt()
    {

    }
}

Foo f;
f.Bar();

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

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

于 2014-09-25T14:07:57.853 回答