我们公司有必要记录某些东西,每当我们的ASP.NET WebApi控制器的一个动作方法被调用时。由于我们现在使用Ninject作为DI,因此我们也希望将其用于此目的。这是我到目前为止所尝试的。如何拦截所有ASP.NET WebApi控制器操作方法调用与Ninject拦截记录?
我Ninject,Ninject.Extensions.Interception和Ninject.Extensions.Interception.DynamicProxy通过的NuGet安装的,我有以下模块
public class InterceptAllModule : InterceptionModule
{
public override void Load()
{
Kernel.Intercept(p => p.Request.Service.Name.EndsWith("Controller")).With(new TimingInterceptor());
}
}
哪里TimingInterceptor是
public class TimingInterceptor : SimpleInterceptor
{
readonly Stopwatch _stopwatch = new Stopwatch();
protected override void BeforeInvoke(IInvocation invocation)
{
_stopwatch.Start();
}
protected override void AfterInvoke(IInvocation invocation)
{
_stopwatch.Stop();
string message = string.Format("[Execution of {0} took {1}.]",invocation.Request.Method,_stopwatch.Elapsed);
Log.Info(message + "\n");
_stopwatch.Reset();
}
}
现在,当我尝试用ninject内核挂接模块,然后运行我的站点
var kernel = new StandardKernel(new InterceptAllModule());
然而,每当有进来的动作方法的一个呼叫时,它抛出一个错误说
Cannot instantiate proxy of class: MyApiController.
可能有经验的人指出我做错了什么吗?谢谢。
也许这个建议是设计中的一个太大的转变,但是当您将所有业务操作抽象为一个通用抽象并将其注入到控制器中时,您将能够轻松装饰或截取这些抽象以添加横切关注点如您的时间方面。看看[命令/处理程序模式](http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91)以了解我在说什么。 – Steven
你有一个额外的无参数构造函数,并且所有的操作方法都是虚拟的吗? –
谢谢雷莫,我添加虚拟所有的行动方法,但无参数构造函数我有一个问题,因为我们的服务对象被注入那里,并在控制器中使用。使用无参数构造函数时,服务对象为null。你如何解决这个问题?非常感谢! –