依赖注入生命周期:Singleton / Scoped / Transient 一次讲透

作者:微信公众号:【架构师老卢】
2-1 10:28
43

在 ASP.NET Core 里,服务注册生命周期基本就三种:

  • Transient:每次解析都会 new 一个
  • Scoped:同一次“作用域”内复用(Web 中通常是“同一个请求”)
  • Singleton:全应用进程只创建一次

1) Transient:轻量、无状态、可随用随建

适合:

  • 纯计算/无状态服务
  • 轻量的包装器(例如格式化、映射器)

风险:

  • 如果对象很重(比如持有大量缓存/连接),Transient 会频繁分配导致性能差

2) Scoped:请求级别的“共享”

适合:

  • DbContext
  • 与“当前请求”强相关的服务(当前用户、租户、审计上下文等)

风险:

  • Scoped 服务注入 Singleton 会出大问题(生命周期倒挂)。通常需要用 IServiceScopeFactory 或把逻辑改成 Scoped。

3) Singleton:全局唯一、需要线程安全

适合:

  • 全局配置、只读缓存
  • 线程安全的客户端(例如一些 SDK 客户端)

风险:

  • 必须线程安全
  • 不要持有请求级状态(否则会“串号”)

速记规则(实用)

  • 默认选 Scoped(尤其是 Web 业务服务)
  • DbContext 必须 Scoped
  • 需要保存全局状态/缓存且线程安全 → Singleton
  • 真正无状态且轻量 → Transient

参考链接

  • Dependency injection in ASP.NET Core:https://learn.microsoft.com/aspnet/core/fundamentals/dependency-injection
相关留言评论
昵称:
邮箱:
阅读排行