【问题标题】:Transient BackgroundService, the instance that is returned is always different?瞬态BackgroundService,返回的实例总是不一样?
【发布时间】:2020-01-23 12:20:41
【问题描述】:

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

Worker<T>:BackgroundService

在启动时我添加如下:

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

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

【问题讨论】:

  • 注册为单例,你将拥有相同的实例。
  • @FlorimMaxhuni 也许我解释错了,目标是让一群工作人员执行任务。我想知道的是,如果要求一个新实例,返回的实际上是一个新实例。

标签: c# asp.net-core .net-core background-service transient


【解决方案1】:

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

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

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

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

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

【讨论】:

  • @Tseng,工作人员内部发生的情况是,它接收配置,并创建一个对象,该对象根据接收到的配置执行 http 请求。对于这种情况,scopedServices 是必要的还是 Transient 就足够了?感谢您的帮助。
  • 对于HttpClient,您不需要范围服务。但是,如果您的工作人员解决了多个需要共享实例的服务(即 DbContext 用于事务),那么您可能必须
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
相关资源
最近更新 更多