2017-02-21 131 views
2

我希望能够访问内置的IoC容器(我相信IServiceProvider)。访问.net核心中的IServiceProvider /容器

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

我的这个特别的应用是我正在使用另一种产品Hangfire。这个框架实例化对象本身。为了将依赖关系注入到这些对象中,您需要覆盖JobActivator类,并在那里引用您自己的容器。

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

任何人都可以帮忙吗?

+0

你的情况是完全有效的。有时你需要延迟或发送对象的创建,这意味着你需要回到'容器'中。只要这个回调在[Composition Root](http://blog.ploeh.dk/2011/07/28/CompositionRoot/)内部实现,这[绝对好](http://blog.ploeh.dk /2011/08/25/ServiceLocatorrolesvs.mechanics/)。 – Steven

回答

0

您可以在配置阶段app.ApplicationServices或使用HttpContext.RequestServices访问IServiceProvider。自定义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(); 
} 
+0

谢谢。这是我最终获得服务提供商的方式。我与Hangfire有不同的问题,但那是另一回事! :) – Zak