Мой вопрос таков: когда я спрашиваю ServiceProvider для нового экземпляра, возвращаемый экземпляр всегда отличается?
Да, в этом смысл "переходного процесса". «Scoped» возвращает один и тот же экземпляр в области (в ASP. NET Core во время одного запроса), а «Singleton» всегда один и тот же экземпляр.
Однако, если ваша временная служба имеет зависимые области, они могут не всегда будет одинаковым (в зависимости от того, решаете ли вы внутри области или нет). Вам следует избегать использования зависимостей в области действия для временных служб.
Если у вас есть службы с определенными областями, и у вас не может быть их временных, необходимо создать область действия. Это может произойти путем вращения задачи, разрешения IServiceScopeFactory
, разрешения необходимых вам служб, вызова их, а затем удаления области действия (которая устраняет все ее области видимости и переходные зависимости)
var scopeFactory = _serviceProvider.GetService<IServiceScopeFactory>()
using(var scope = scopeFactory.CreateScope())
{
var myService = scope.ServiceProvider.GetRequiredService<Worker<MyT>>();
}