瞬态后台服务,返回的实例总是不一样的?



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

Worker<T>:BackgroundService

在启动中,我按如下方式添加它:

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

我的问题是,当我向服务提供商询问新实例时,返回的实例总是不同的?

我的问题是,当我向服务提供商询问新实例时,返回的实例总是不同的?

是的,这就是"短暂"的意义所在。"作用域"返回作用域内的同一实例(在一个请求期间 ASP.NET Core 中(,而"单一实例"始终是同一实例。

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

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

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

最新更新