我有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")]
答案 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()
。
正如您所描述的那样,我认为您的基本控制器类正在调用doSomethingOnEnter
和doSomethingOnExit
方法。如前所述,这不起作用。