Я пытаюсь выполнить некоторые длительные операции в фоновом режиме. Этим операциям потребуется доступ к некоторым службам, которые были зарегистрированы с помощью ServiceCollection в Startup.cs.
Я внедряю 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);
....
}