在 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