我希望能够访问内置的IoC容器(我相信IServiceProvider
)。
我知道在代码中访问它通常是不好的做法,我们应该允许框架注入控制器等所需的依赖项。
我的特殊申请是我正在使用其他产品Hangfire。该框架实例化对象本身。为了将依赖注入到这些对象中,您需要覆盖JobActivator类并在那里引用您自己的容器。
This问题显示了如何为测试目的创建一个新容器,但我想访问我已经设置的容器而不必复制它。使用像Autofac这样的DI框架,您可以在添加所有服务后构建容器时访问容器。
有人可以帮忙吗?
答案 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();
}