文章目录
- 1、概念:服务生命周期
- 单例 (Singleton) :
- 作用域 (Scoped) :
- 瞬态 (Transient) :
- 2、对 Scoped 和 Transient 进一步辨析
- Scoped 生命周期
- Transient 生命周期
- 选择哪种生命周期
1、概念:服务生命周期
单例 (Singleton) :
整个应用程序生命周期中只有一个实例被创建并共享。
如果你在依赖注入容器中将 AsyncPeriodicBackgroundWorkerBase 的实现注册为单例,那么这个任务将会是单例的。
作用域 (Scoped) :
每个请求一个新实例,通常在 Web 应用中使用。
如果你将它注册为作用域服务,每个作用域(例如 HTTP 请求)中会创建一个新的实例。
瞬态 (Transient) :
每次请求时都会创建一个新的实例。
如果注册为瞬态服务,每次获取该服务时都会得到一个新的实例。
如何确定任务是否为单例
假设你是在使用 ASP.NET Core 或类似的依赖注入框架,你可以通过如下方式注册到服务中来决定生命周期:
public void ConfigureServices(IServiceCollection services)
{// 将该任务注册为单例services.AddSingleton<MyBackgroundWorker>();// 或者作为一个作用域实例// services.AddScoped<MyBackgroundWorker>();// 或者作为一个瞬态实例// services.AddTransient<MyBackgroundWorker>();
}
2、对 Scoped 和 Transient 进一步辨析
在后端服务中(例如使用 ASP.NET Core 的应用程序),Scoped 和 Transient 是两种常用的服务生命周期管理方式,它们定义了服务实例的创建和使用方式。了解它们之间的区别对于选择合适的服务生命周期管理有重要意义:
Scoped 生命周期
Scoped 服务在每个请求(或作用域,一个会话内)中被创建一次。一个请求期间同一服务的所有请求将获得相同的实例。
-
使用场景 :
通常用于 Web 应用程序中,作用域服务在每个 HTTP 请求的开始时创建,并在请求结束时释放。这种方式适合那些需要在同一请求上下文共享数据的情况下使用。
例如,通常数据库上下文(DbContext)就会被注册为 Scoped 以保证一个请求使用同一个数据库连接。 -
适用性 :
不适用于非 Web 场景或者后台服务中没有请求界限的情况下使用。
Transient 生命周期
Transient 服务在每次请求它们的时候都会创建一个新的实例。即,每次获取服务都会得到一个新的实例。
- 使用场景 :
适用于轻量级无状态的服务,比如:工具类、转换器等,每次使用都需要新的实例,而不需要在不同请求或调用之间保持状态。
优化系统内存开销,保证服务独占其状态。 - 适用性 :
适用于多种类型的应用场景,不受限于请求或作用域的边界。
因为它是每次请求创建新实例,所以使用时需要注意控制实例构造成本,以减少性能消耗。
选择哪种生命周期
Scoped :使用 Scoped 主要是针对应用的请求/会话生命周期,适合单请求内的数据一致性场景。
Transient :使用 Transient 主要是为了实现无状态的轻量级服务,每次都可创建独立实例的使用场景。