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





Вы должны использовать ФонСервис для фоновых задач.
В любом случае, вы можете создать новую область с помощью IServiceScopeFactory:
public WorkflowService(IServiceScopeFactory serviceProviderFactory)
{
var scope = serviceProviderFactory.CreateScope();
_serviceProvider = scope.ServiceProvider;
}
.net core имеет фоновые службы, поддерживающие DI