【问题标题】:LightInject - Interception not intercepting dependenciesLightInject - 拦截不拦截依赖项
【发布时间】:2016-11-28 15:36:23
【问题描述】:

我在 MVC 网站上使用带有 ServiceProvider 适配器的 LightInject。我正在尝试将它连接到 MiniProfiler,但我运气不佳。 MiniProfiler 似乎正在捕获 MVC 控制器生命周期,但没有捕获任何依赖项: Mini Profiler Image Profiling Dump (I was debugging during this screenshot - ignore the 61,744 ms duration)

这就是我初始化容器的方式:

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生命周期中的每个操作

【问题讨论】:

    标签: c# asp.net-mvc mvc-mini-profiler light-inject miniprofiler


    【解决方案1】:

    我想通了。我需要创建方法virtual

    来自 LightInject 的文档:

    任何标记为虚拟的成员都可以被拦截。

    我错过了那部分。希望这对将来的某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 2013-06-25
      • 2018-08-09
      • 2023-03-13
      • 2018-01-30
      相关资源
      最近更新 更多