Zak*_*Zak 5 c# dependency-injection .net-core
我希望能够访问内置的 IoC 容器(IServiceProvider我相信)。
我知道在代码中访问它通常是不好的做法,我们应该允许框架将所需的任何依赖项注入到控制器之类的东西中。
我对此的具体应用是我正在使用另一种产品Hangfire。该框架本身实例化对象。为了将依赖项注入到这些对象中,您需要重写JobActivator类并在那里引用您自己的容器。
这个问题展示了如何创建一个新的容器用于测试目的,但我想访问我已经设置的容器,而不必重复它。使用像 Autofac 这样的 DI 框架,您可以在添加所有服务后构建容器时访问容器。
有人可以帮忙吗?
您可以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)
| 归档时间: |
|
| 查看次数: |
3220 次 |
| 最近记录: |