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 适合轻量对象。
  • 生命周期选择要和释放策略一起设计。
ASP.NET Core 依赖注入与生命周期选择 | Remi Resume