【发布时间】:2023-03-23 20:03:01
【问题描述】:
每次调用我们的 ASP.NET WebApi 控制器的一种操作方法时,我们公司都需要记录某些事情。由于我们现在将 Ninject 用于 DI,因此我们也希望将它用于此目的。这是我迄今为止尝试过的。
我通过 NuGet 安装了 Ninject、Ninject.Extensions.Interception 和 Ninject.Extensions.Interception.DynamicProxy,并且我有以下模块
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.
请有经验的人指出我做错了什么?谢谢。
【问题讨论】:
-
也许这个建议在设计上是一个太大的转变,但是当您将所有业务操作抽象到一个通用抽象背后并将其注入控制器时,您将能够轻松装饰或拦截这些抽象以添加横切关注点,例如您的时间方面。查看command/handler pattern 了解我在说什么。
-
你有没有额外的无参数构造函数,所有的动作方法都是虚拟的吗?
-
感谢 Remo,我在所有操作方法中添加了 virtual,但是对于无参数构造函数,我遇到了问题,因为我们的服务对象被注入那里并在控制器中使用。使用无参数构造函数,服务对象为空。你如何解决这个问题?非常感谢!
标签: asp.net-mvc logging asp.net-web-api ninject ninject-interception