我正在尝试在后台执行一些长时间运行的操作。这些操作将需要访问在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);
....
}
答案 0 :(得分:0)
您应该使用BackgroundService进行后台任务。
无论如何,您可以使用IServiceScopeFactory
创建新范围:
public WorkflowService(IServiceScopeFactory serviceProviderFactory)
{
var scope = serviceProviderFactory.CreateScope();
_serviceProvider = scope.ServiceProvider;
}