如何在ASP.NET Core中动态解决InstancePerLifetimeScope依赖关系?

时间:2017-07-24 15:33:37

标签: c# asp.net-core autofac

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

我在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相同,但我不想将引用传递给我所有的类。

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

1 个答案:

答案 0 :(得分:0)

我最终注入了IHttpContextAccessor:

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