获取.net core中IServiceProvider/容器的访问权限

Zak*_*Zak 5 c# dependency-injection .net-core

我希望能够访问内置的 IoC 容器(IServiceProvider我相信)。

我知道在代码中访问它通常是不好的做法,我们应该允许框架将所需的任何依赖项注入到控制器之类的东西中。

我对此的具体应用是我正在使用另一种产品Hangfire。该框架本身实例化对象。为了将依赖项注入到这些对象中,您需要重写JobActivator类并在那里引用您自己的容器。

这个问题展示了如何创建一个新的容器用于测试目的,但我想访问我已经设置的容器,而不必重复它。使用像 Autofac 这样的 DI 框架,您可以在添加所有服务后构建容器时访问容器。

有人可以帮忙吗?

mez*_*tou 3

您可以IServiceProvider在配置阶段app.ApplicationServices或使用HttpContext.RequestServices. 自定义JobActivator应该如下所示:

public class AspNetCoreJobActivator : JobActivator
{
    private IServiceProvider _serviceProvider;

    public AspNetCoreJobActivator(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    public AspNetCoreJobActivator(IHttpContextAccessor httpContextAccessor)
    {
        _serviceProvider = httpContextAccessor.HttpContext.RequestServices;
    }

    public AspNetCoreJobActivator(HttpContext context)
    {
        _serviceProvider = context.RequestServices;
    }

    public override object ActivateJob(Type type)
    {
        return _serviceProvider.GetService(type);
    }
}
Run Code Online (Sandbox Code Playgroud)

在文件中Startup.cs

public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
{
    GlobalConfiguration.Configuration.UseActivator(new AspNetCoreJobActivator(serviceProvider)); // or app.ApplicationServices
    var server = new Hangfire.BackgroundJobServer();

    app.UseMvcWithDefaultRoute();
}
Run Code Online (Sandbox Code Playgroud)