我在一个MVC网站上使用LightInject和ServiceProvider适配器。我正试图把它连接到MiniProfiler上,但我运气不太好。MiniProfiler似乎正在捕获MVC控制器生命周期,但没有任何依赖项:迷你Profiler图像剖析转储(我在此截图期间调试-忽略61,744毫秒的持续时间)
我就是这样初始化容器的:
protected override IServiceProvider BuildServiceProvider(IServiceCollection serviceCollection)
{
var container = new ServiceContainer();
container.Register<IInterceptor, MiniProfilerInterceptor>();
foreach (var descriptor in serviceCollection)
{
if (descriptor.ServiceType.AssemblyQualifiedName.StartsWith("ProjectName"))
{
container.Intercept(s => s.ServiceType == descriptor.ServiceType, i => i.GetInstance<IInterceptor>());
}
}
var serviceProvider = container.CreateServiceProvider(serviceCollection);
return serviceProvider;
}拦截器看起来如下:
public class MiniProfilerInterceptor : IInterceptor
{
public object Invoke(IInvocationInfo invocation)
{
var profiler = MiniProfiler.Current;
var returnType = invocation.Method.ReturnType;
using (profiler.Step(invocation.Proxy.GetType().Name + ":" + invocation.Method.Name))
{
return invocation.Proceed();
}
}
}这是控制器和测试依赖项:
public class SomeDependencyController : Controller
{
private readonly SomeDependency _dependency;
public SomeDependencyController(SomeDependency dependency)
{
_dependency = dependency;
}
public MvcHtmlString DoSomething()
{
_dependency.DoSomething();
return new MvcHtmlString("Did it");
}
public ActionResult DoRender()
{
_dependency.DoSomething();
return View("DoRender");
}
}
public class SomeDependency
{
public void DoSomething()
{
Thread.Sleep(1000);
}
}我在拦截器代码中扔了一个断点。它从不为SomeDependency输入任何东西的拦截器,但它为SomeDependencyController的MVC生命周期中的每一个操作都输入了拦截器。
发布于 2016-11-28 16:32:28
我想通了。我需要使方法virtual。
来自LightInject的文档:
任何被标记为虚拟的成员都可以被截获。
我错过了那部分。希望这能对未来的人有所帮助。
https://stackoverflow.com/questions/40848094
复制相似问题