C#服务生命周期:Singleton、Scoped、Transient用法及说明

 更新时间:2025年01月20日 14:18:05   作者:bestcxx  
文章介绍了三种服务生命周期:单例、作用域和瞬态,并讨论了如何在ASP.NETCore中使用这些生命周期管理服务,单例在应用程序生命周期中只有一个实例,作用域在每个请求中创建一个新实例,瞬态每次请求时创建一个新实例

概念:服务生命周期

单例 (Singleton) 

整个应用程序生命周期中只有一个实例被创建并共享。

如果你在依赖注入容器中将 AsyncPeriodicBackgroundWorkerBase 的实现注册为单例,那么这个任务将会是单例的。

作用域 (Scoped) 

每个请求一个新实例,通常在 Web 应用中使用。

如果你将它注册为作用域服务,每个作用域(例如 HTTP 请求)中会创建一个新的实例。

瞬态 (Transient) :

每次请求时都会创建一个新的实例。

如果注册为瞬态服务,每次获取该服务时都会得到一个新的实例。

如何确定任务是否为单例

假设你是在使用 ASP.NET Core 或类似的依赖注入框架,你可以通过如下方式注册到服务中来决定生命周期:

public void ConfigureServices(IServiceCollection services)
{
    // 将该任务注册为单例
    services.AddSingleton<MyBackgroundWorker>();
    
    // 或者作为一个作用域实例
    // services.AddScoped<MyBackgroundWorker>();

    // 或者作为一个瞬态实例
    // services.AddTransient<MyBackgroundWorker>();
}

对 Scoped 和 Transient 进一步辨析

在后端服务中(例如使用 ASP.NET Core 的应用程序),Scoped 和 Transient 是两种常用的服务生命周期管理方式,它们定义了服务实例的创建和使用方式。

了解它们之间的区别对于选择合适的服务生命周期管理有重要意义:

Scoped 生命周期

Scoped 服务在每个请求(或作用域,一个会话内)中被创建一次。一个请求期间同一服务的所有请求将获得相同的实例。

使用场景 :

  • 通常用于 Web 应用程序中,作用域服务在每个 HTTP 请求的开始时创建,并在请求结束时释放。这种方式适合那些需要在同一请求上下文共享数据的情况下使用。
  • 例如,通常数据库上下文(DbContext)就会被注册为 Scoped 以保证一个请求使用同一个数据库连接。

适用性 :

  • 不适用于非 Web 场景或者后台服务中没有请求界限的情况下使用。

Transient 生命周期

Transient 服务在每次请求它们的时候都会创建一个新的实例。即,每次获取服务都会得到一个新的实例。

使用场景 :

  • 适用于轻量级无状态的服务,比如:工具类、转换器等,每次使用都需要新的实例,而不需要在不同请求或调用之间保持状态。
  • 优化系统内存开销,保证服务独占其状态。

适用性:

  • 适用于多种类型的应用场景,不受限于请求或作用域的边界。
  • 因为它是每次请求创建新实例,所以使用时需要注意控制实例构造成本,以减少性能消耗。

选择哪种生命周期

  • Scoped:使用 Scoped 主要是针对应用的请求/会话生命周期,适合单请求内的数据一致性场景。
  • Transient:使用 Transient 主要是为了实现无状态的轻量级服务,每次都可创建独立实例的使用场景。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Unity3D实现扭动挤压浏览效果

    Unity3D实现扭动挤压浏览效果

    这篇文章主要为大家详细介绍了Unity3D实现扭动挤压浏览效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • C#将DataGridView中的数据保存到CSV和Excel中

    C#将DataGridView中的数据保存到CSV和Excel中

    这篇文章介绍了C#将DataGridView中的数据保存到CSV和Excel中的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#实现WebAPI接口安全加密的具体方案

    C#实现WebAPI接口安全加密的具体方案

    在项目开发过程中,接口的安全性往往是一个容易被忽视但极其关键的环节,本文介绍了一套实际项目中已落地的 Web API 安全加密方案,涵盖了 SHA256 加签、RSA 非对称加密、AES 对称加密 以及相关数据格式转换等内容,需要的朋友可以参考下
    2025-06-06
  • C#控制台实现简单飞行棋游戏

    C#控制台实现简单飞行棋游戏

    这篇文章主要为大家详细介绍了C#控制台实现简单飞行棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C#传递参数到线程的方法汇总

    C#传递参数到线程的方法汇总

    这篇文章主要介绍了C#传递参数到线程的方法,非常实用,需要的朋友可以参考下
    2014-08-08
  • C#中分部类和分部方法(partial)

    C#中分部类和分部方法(partial)

    分部类(partial class)是C#中用于解决机器生成代码与人工编写代码冲突的一种特性,主要用于自动生成的代码场景,本文给大家介绍C#中分部类和分部方法(partial),感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • 使用C#合并PDF文档的实现步骤

    使用C#合并PDF文档的实现步骤

    在当今的数字化办公环境中,PDF文档已经成为信息交换和存档的标准格式,然而,在许多业务场景中,开发者会面临一个共同的需求:将多个PDF文档合并为一个,本文将深入探讨如何利用Spire.PDF for .NET 这一强大的工具,帮助C#开发者轻松实现PDF文档的合并,需要的朋友可以参考下
    2025-09-09
  • 在C#语言里对NULL的技术处理小结

    在C#语言里对NULL的技术处理小结

    在 C# 中处理 null 值是编写可靠且可靠的代码的一个重要方面,在本文中,我将讨论一些在 C# 中处理 null 值的最常用技术,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • C#并行编程之PLINQ(并行LINQ)

    C#并行编程之PLINQ(并行LINQ)

    这篇文章介绍了C#并行编程之PLINQ(并行LINQ),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#中的委托使用

    C#中的委托使用

    委托是C#中新加入的一个类型,可以把它想作一个和Class类似的一种类型,和使用类相似,使用一个委托时,需要两个步骤,首先你要定义一个委托,就像是定义一个类一样;然后,你可以创建一个或多个该委托的实例。
    2016-07-07

最新评论