Как я могу получить доступ к IServiceCollection из фонового потока

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

.net core имеет фоновые службы, поддерживающие DI

Daniel A. White 08.05.2019 03:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
756
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Другие вопросы по теме

Похожие вопросы

Как обновить/сохранить значение шагового двигателя для последующего использования?
Проблема десериализации объекта между двумя разными DataContracts
SelectPDF.Document.Footer всегда имеет значение null?
Невозможно получить групповую политику для машины удаленно, без входа в систему вручную хотя бы один раз
Произошло необработанное исключение типа «System.StackOverflowException», и сначала возникло несколько различных проблем с toString
Использование сопрограмм для плавного появления/исчезновения текстового элемента TextMeshPro
Как изменить автоматически назначенный тип данных DateTime2 на DateTime с помощью EF Core, Code First?
Добавить фрагмент в программно сгенерированный FrameLayout
Связь между двумя объектами не может быть определена, поскольку они присоединены к разным объектам ObjectContext Entity Framework
Должен ли я иметь один класс ViewModel, реализующий INotifyPropertyChanged для каждого класса Model?