我正在尝试在后台执行一些长期运行的操作。这些操作将需要访问某些在startup.cs中注册的服务。
我正在将IserviceProvider注入将要产生背景线程的类。
public WorkflowService(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
(注意,我不能注入单个服务,因为我不知道要调用哪个组件,并且每个组件都需要哪些服务(。
我然后将_serviceProvider传递到将在后台执行的方法。
Task task = new Task(() => ExecuteStep(firstStep, workflowInstanceId, workflowMetadata, _serviceProvider));
task.Start();
ths问题是,当我尝试在背景线程上解决服务时,IserviceProvider已被处理,我得到了例外。
object service = _serviceProvider.GetRequiredService(item.GetType());
在ASP.NET 4.5中,我可以通过使用globalConfiguration.configuration.configuration.ipendentencyResolver实现了类似的成就,但是我找不到Core 2.2中等价的东西,或者找出正确的方法。
using (var scope = GlobalConfiguration.Configuration.DependencyResolver.BeginScope())
{
....
//Obtain the Type from the DI container
object service = scope.GetService(serviceType);
....
}
您应该使用背景服务进行背景任务。
无论如何,您可以使用IServiceScopeFactory
创建新范围:
public WorkflowService(IServiceScopeFactory serviceProviderFactory)
{
var scope = serviceProviderFactory.CreateScope();
_serviceProvider = scope.ServiceProvider;
}