Transient BackgroundService, экземпляр, который возвращается всегда отличается? - PullRequest
1 голос
/ 23 января 2020

Итак, у меня есть сценарий, в котором я должен выполнять несколько задач параллельно, у меня есть класс с обобщенным типом c, который наследуется от BackgroundService , который будет отвечать за выполнение одной задачи , Для каждой задачи я хочу, чтобы новый экземпляр выполнял данную задачу. Цель состоит в том, чтобы иметь пул рабочих.

Worker<T>:BackgroundService

При запуске я добавляю его следующим образом:

services.AddTransient(typeof(Worker<>));

Мой вопрос: когда я спрашиваю ServiceProvider для нового экземпляра возвращаемый экземпляр всегда отличается?

1 Ответ

3 голосов
/ 23 января 2020

Мой вопрос таков: когда я спрашиваю ServiceProvider для нового экземпляра, возвращаемый экземпляр всегда отличается?

Да, в этом смысл "переходного процесса". «Scoped» возвращает один и тот же экземпляр в области (в ASP. NET Core во время одного запроса), а «Singleton» всегда один и тот же экземпляр.

Однако, если ваша временная служба имеет зависимые области, они могут не всегда будет одинаковым (в зависимости от того, решаете ли вы внутри области или нет). Вам следует избегать использования зависимостей в области действия для временных служб.

Если у вас есть службы с определенными областями, и у вас не может быть их временных, необходимо создать область действия. Это может произойти путем вращения задачи, разрешения IServiceScopeFactory, разрешения необходимых вам служб, вызова их, а затем удаления области действия (которая устраняет все ее области видимости и переходные зависимости)

var scopeFactory = _serviceProvider.GetService<IServiceScopeFactory>()
using(var scope = scopeFactory.CreateScope())
{
     var myService = scope.ServiceProvider.GetRequiredService<Worker<MyT>>();
}
...