访问.net核心中的IServiceProvider /容器

时间:2017-02-21 09:23:08

标签: dependency-injection .net-core

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

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

我的特殊申请是我正在使用其他产品Hangfire。该框架实例化对象本身。为了将依赖注入到这些对象中,您需要覆盖JobActivator类并在那里引用您自己的容器。

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

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您可以在配置阶段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);
    }
}

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();
}