当前位置: 代码网 > it编程>编程语言>Asp.net > C#服务生命周期:Singleton、Scoped、Transient用法及说明

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

2025年01月21日 Asp.net 我要评论
概念:服务生命周期单例 (singleton)整个应用程序生命周期中只有一个实例被创建并共享。如果你在依赖注入容器中将 asyncperiodicbackgroundworkerbase 的实现注册为

概念:服务生命周期

单例 (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 主要是为了实现无状态的轻量级服务,每次都可创建独立实例的使用场景。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com