Transient BackgroundService,返回的实例总是不同的?

Transient BackgroundService, the instance that is returned is always different?

所以我有一个场景,我必须并行执行多个任务,我有一个 class,其泛型类型继承自 BackgroundService,它将负责执行单个任务。对于每项任务,我都希望有一个新实例来执行给定的任务。目标是拥有一批工人。

Worker<T>:BackgroundService

在启动中我添加如下:

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

我的问题是,当我向 ServiceProvider 询问新实例时,返回的实例总是不同的?

My question is, when i ask the ServiceProvider for a new instance, the instance that is returned is always different?

是的,这就是 "transient" 的意义所在。 "Scoped" returns 范围内的同一实例(在一个请求期间在 ASP.NET 核心中)并且 "Singleton" 始终是同一实例。

但是,如果您的瞬态服务具有范围内的依赖项,则这些依赖项可能并不总是相同的(取决于您是否在范围内解析)。你应该避免对瞬态服务有作用域依赖。

如果您有作用域服务并且不能让它们瞬态,则必须创建一个作用域。这可以通过旋转任务、解析 IServiceScopeFactory、解析您需要的服务、调用它们,然后处置范围(处置其所有范围和瞬态依赖项)

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