我如何从后台线程访问IServiceCollection

时间:2019-05-08 00:31:42

标签: c# asp.net-core task

我正在尝试在后台执行一些长时间运行的操作。这些操作将需要访问在Startup.cs中已向ServiceCollection注册的某些服务。

我正在将IServiceProvider注入要生成后台线程的类。

public WorkflowService(IServiceProvider serviceProvider)
{
    _serviceProvider = serviceProvider;
}

注意,我无法注入单独的服务,因为我事先不知道将调用哪个组件以及每个组件将需要哪些服务。)

然后我将_serviceProvider传递给将在后台执行的方法。

Task task = new Task(() => ExecuteStep(firstStep, workflowInstanceId, workflowMetadata, _serviceProvider));
task.Start();

问题是,当我尝试在后台线程上解析服务时,IServiceProvider已被处置,并且出现异常。

object service = _serviceProvider.GetRequiredService(item.GetType());

在ASP.NET 4.5中,我可以通过使用GlobalConfiguration.Configuration.DependencyResolver来实现类似的目的,但是我无法在Core 2.2中找到等效的东西,也找不到解决该问题的正确方法。

using (var scope = GlobalConfiguration.Configuration.DependencyResolver.BeginScope())
{

....
     //Obtain the Type from the DI container
     object service = scope.GetService(serviceType);
....
}

1 个答案:

答案 0 :(得分:0)

您应该使用BackgroundService进行后台任务。

无论如何,您可以使用IServiceScopeFactory创建新范围:

public WorkflowService(IServiceScopeFactory serviceProviderFactory)
{
    var scope = serviceProviderFactory.CreateScope();
    _serviceProvider = scope.ServiceProvider;
}