LightInject - Перехват без перехвата зависимостей

Я использую 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


person Ben Lipson    schedule 28.11.2016    source источник


Ответы (1)


Я понял. Мне нужно было сделать метод virtual.

Из документации LightInject:

Любой элемент, помеченный как виртуальный, может быть перехвачен.

Я пропустил эту часть. Надеюсь, это поможет кому-то в будущем.

person Ben Lipson    schedule 28.11.2016