前言
依赖注入(Dependency Injection, DI) 是一种实现控制反转(Inversion of Control, IoC) 的软件设计模式,也是构建松耦合、可测试、易维护应用程序的核心技术。其核心理念是:不要在类内部创建依赖,而是由外部容器将依赖注入进来。
在现代 ASP.NET Core 中内置了强大的 DI 容器,正确使用 DI 的关键在于理解 Transient、Scoped 和 Singleton 这三种服务生命周期,它们决定了服务实例的创建时机、共享范围与生命周期。本文将清晰解析三者的区别和适用场景。
简单概述
在 ASP.NET Core 中,依赖注入容器通过 IServiceCollection支持三种服务注册生命周期:
IServiceCollection 是 .NET 依赖注入(DI)系统中的核心接口之一,用于注册和管理应用程序所需的服务。
|
生命周期
|
注册方法
|
实例创建时机
|
共享范围
|
| --- | --- | --- | --- |
|
Transient(瞬态)
| AddTransient<T>() |
每次请求都创建新实例
|
不共享
|
|
Scoped(作用域)
| AddScoped<T>() |
每个作用域(如 HTTP 请求)创建一次
|
在同一作用域内共享
|
|
Singleton(单例)
| AddSingleton<T>() |
应用启动时创建一次(或首次使用时)
|
整个应用生命周期共享
|
选型口诀
- 跨请求共享、需复用 → Singleton(线程安全要做好)
- 请求内共享、一致性、上下文传递 → Scoped
- 一次性、无状态、轻量 → Transient
Transient(瞬态)
每次从 DI 容器请求服务时,都会创建一个全新的实例 。
适用场景
- 轻量级、无状态的服务。
- 请求级独立状态:每次调用需要独立状态或副作用隔离的组件。
- 短生命周期依赖链:依赖链中各服务都很轻、无共享资源的场景。
Scoped(作用域)
在同一个作用域内 共享同一个实例,不同作用域创建不同实例。
在 ASP.NET Core 中,每个 HTTP 请求就是一个作用域 。
适用场景
- 需要在单次请求中共享状态的服务。
- 数据库上下文(DbContext):AddDbContext
() 默认注册为 Scoped,保证同一 HTTP 请求内复用同一个数据库上下文,避免实体跟踪混乱、重复连接开销,并支持事务一致性。
- 工作单元(Unit of Work)与数据仓储(Repository):与 DbContext 同生命周期,保障查询→修改→提交的一致性,并减少资源创建销毁。
Singleton(单例)
整个应用程序生命周期内只创建一次实例 ,所有请求共享同一个对象。
适用场景
- 无状态、线程安全的全局服务(如工具类、映射器)。
- 配置封装服务(如 IAppSettings),启动后内容不变。
- 全局缓存(如 IMemoryCache),需跨请求共享数据。
参考文章
DotNetGuide编程学院
DotNetGuide编程学院是一个专注于C#/.NET/.NET Core学习、工作、面试干货和实战教程分享的知识星球!当然这里不仅仅只有C#/.NET/.NET Core还有前端、云原生(Docker,K8s)、分布式,微服务、实用工具、学习书籍、AIGC、AI赋能、求职和招聘资讯、热点资讯等多个领域,我们致力于构建一个积极向上、和谐友善的.NET技术交流、学习平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。
加入后如果感觉不值得,3天内在知识星球APP右上角点击退出星球,可直接全额退款,无任何套路!
- 免费开源的程序员简历模板 ===================================================================================================================================================
- 了解作者&获取更多学习资料 ======================================================================================================================================================================================================================================
- 程序员常用的开发工具软件推荐 =======================================================================================================================================================================================================================================
- 加入DotNetGuide技术社区交流群 =============================================================================================================================================================================================================================================
- C#/.NET/.NET Core推荐学习书籍
- C#/.NET/.NET Core学习视频汇总
- .NET/.NET Core ORM框架资源汇总 =================================================================================================================================================================================================================================================
- C#/.NET/.NET Core开发者学习路线集 ==================================================================================================================================================================================================================================================
- C#/.NET/.NET Core面试宝典(基础版)
- C#/.NET/.NET Core优秀项目和框架推荐
- C#/.NET/.NET Core学习、工作、面试指南
学习是一个永无止境的过程,你知道的越多,你不知道的也会越多,在有限的时间内坚持每天多学一点,你一定能成为你想要成为的那个人。不积跬步无以至千里,不积小流无以成江海!
