Как я могу получить доступ к IServiceCollection из фонового потока - PullRequest
0 голосов
/ 08 мая 2019

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

1 Ответ

0 голосов
/ 08 мая 2019

Вы должны использовать BackgroundService для фоновых задач.

В любом случае, вы можете создать новую область с помощью IServiceScopeFactory:

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