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

Ped*_*ito 0 c# transient background-service .net-core asp.net-core

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

Worker<T>:BackgroundService
Run Code Online (Sandbox Code Playgroud)

在启动中我添加如下:

services.AddTransient(typeof(Worker<>));
Run Code Online (Sandbox Code Playgroud)

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

Tse*_*eng 5

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

是的,这就是“瞬态”的意义所在。“Scoped”返回范围内的相同实例(在一个请求期间的 ASP.NET Core 中),而“Singleton”始终是相同的实例。

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

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

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