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

问题描述 投票:0回答:1

因此,我不得不并行执行多个任务,而我的类具有从BackgroundService继承的泛型类型,该类将负责执行单个任务。对于每个任务,我都希望一个新实例执行给定的任务。目标是要有一批工人。

Worker<T>:BackgroundService

在启动时,我将其添加如下:

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

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

c# asp.net-core .net-core background-service transient
1个回答
2
投票

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

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

但是,如果您的临时服务具有范围内的依赖关系,则它们可能并不总是相同的(取决于您是否在范围内解析)。您应该避免对临时服务具有范围依赖性。

如果您有范围服务,并且您不能使它们处于瞬态状态,则必须创建一个范围。这可能是通过旋转任务,解析IServiceScopeFactory,解析所需的服务,调用它们,然后处置范围(处置其所有范围和临时依赖性)而发生的。

var scopeFactory = _serviceProvider.GetService<IServiceScopeFactory>()
using(var scope = scopeFactory.CreateScope())
{
     var myService = scope.ServiceProvider.GetRequiredService<Worker<MyT>>();
}
© www.soinside.com 2019 - 2024. All rights reserved.