Я использую LightInject с адаптером ServiceProvider на веб-сайте MVC. Я пытаюсь подключить его к MiniProfiler, но мне не очень везет. MiniProfiler, по-видимому, фиксирует жизненный цикл контроллера MVC, но не какие-либо зависимости: (во время этого снимка экрана я выполнял отладку - игнорируйте продолжительность 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
, но входит для каждого действия в жизненном цикле MVC для SomeDependencyController