2026-06-09 / C# / .NET Core
ASP.NET Core 依赖注入与生命周期选择
DI 生命周期不是注册语法问题,而是资源、线程安全和请求边界的设计问题。
ASP.NET Core.NET
ASP.NET Core 依赖注入与生命周期选择
依赖注入的核心不是框架魔法,而是把对象创建和对象使用分开。真正容易出问题的地方,是生命周期选错。
flowchart TB
A["应用启动"] --> B["Singleton"]
C["每个 HTTP 请求"] --> D["Scoped"]
E["每次解析"] --> F["Transient"]
B --> G["必须线程安全"]
D --> H["适合业务服务 / DbContext"]
F --> I["轻量无状态对象"]
实际工程场景
DbContext 通常应该是 Scoped,因为它跟一次请求或一个工作单元绑定。把它注入 Singleton,会让请求状态泄漏到全局生命周期。
常见误区
- 觉得 Singleton 性能最好就全部注册成 Singleton。
- 在 Singleton 中捕获 Scoped 服务。
- Transient 对象很重却频繁创建。
最佳实践
- 默认从 Scoped 思考业务服务。
- Singleton 必须无状态或线程安全。
- Transient 适合轻量对象。
- 生命周期选择要和释放策略一起设计。