依赖注入(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>() | 应用启动时创建一次(或首次使用时) | 整个应用生命周期共享 |
每次从 DI 容器请求服务时,都会创建一个全新的实例。
在同一个作用域内共享同一个实例,不同作用域创建不同实例。
在 ASP.NET Core 中,每个 HTTP 请求就是一个作用域。
整个应用程序生命周期内只创建一次实例,所有请求共享同一个对象。