【问题标题】:How to dynamically resolve InstancePerLifetimeScope dependency in ASP.NET Core?如何动态解决 ASP.NET Core 中的 InstancePerLifetimeScope 依赖关系?
【发布时间】:2017-07-24 15:33:37
【问题描述】:

我有一个 ASP.NET Core 项目。我想在我的其他依赖项中动态解析“每个请求一个实例”依赖项。

我在我的 Startup 类中使用 Autofac 作为 InstancePerLifetimeScope 依赖项注册了一个依赖项:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    var builder = new ContainerBuilder();
    builder.RegisterType<MyDependency>().AsImplementedInterfaces().InstancePerLifetimeScope();
    return new AutofacServiceProvider(builder.Build());
}

当我在控制器的构造函数中直接使用此依赖项时,它按预期工作 - 它是每个请求的新实例。:

public MyController(IMyDependency dependency)
{
}

我想在其中一个依赖类中实现相同的目标。依赖是动态的,所以我想从 IServiceProvider 解决这个问题:

public class MyDeepDeepDependency
{
    public MyDeepDeepDependency(IServiceProvider serviceProvider)
    {
        var dep = serviceProvider.GetService(typeof(IMyDependency));
    }
}

但是,“dep”实例在所有请求中都是相同的。
我假设每个请求都会创建一个新范围,并且控制器是从新范围解析的。在解析 IServiceProvider 时,我总是得到一个根 IServiceProvider 而不是一个请求。

有没有办法解决特定于请求的 IServiceProvider?我认为它与控制器中的 HttpContext.RequestServices 相同,但我不想通过我的所有类传递引用。

有没有其他方法可以解决每个请求一次的动态依赖关系?

【问题讨论】:

    标签: c# asp.net-core autofac


    【解决方案1】:

    我最终注入了 IHttpContextAccessor:

    public class MyDeepDeepDependency
    {
        public MyDeepDeepDependency(IHttpContextAccessor contextAccessor)
        {
            var dep = contextAccessor.HttpContext.RequestServices.GetService(typeof(IMyDependency));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多