如何从背景线程访问iservCollection



我正在尝试在后台执行一些长期运行的操作。这些操作将需要访问某些在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;
}

最新更新