ASP.NET CORE 依赖注入的三种方式,分别是什么,使用场景

依赖注入 (Dependency Injection,简称 DI)中,通常有三种常见的服务生命周期模式,用于控制服务实例的创建和管理。这些模式分别是:TransientScopedSingleton 。这三种模式在 ASP.NET Core 中非常重要,因为它们决定了依赖项在应用程序中的生命周期。以下是这三种模式的详细解释:

1. Transient(瞬态)

  • 生命周期: 每次请求都会创建一个新的服务实例。
  • 适用场景: 短生命周期、无状态的服务。每次注入时需要一个新的对象实例。
  • 注册方式: services.AddTransient<TService, TImplementation>();

特点:

  • 当你需要服务在每个请求中创建一个新实例时,使用 Transient
  • 不共享实例,因此每次注入都会得到一个新的对象。
  • 适合那些不保存状态的服务,比如某些业务逻辑操作、数据库查询等。

示例:

复制代码

csharpCopy Code

public void ConfigureServices(IServiceCollection services) { services.AddTransient<IMyService, MyService>(); }

使用场景:

  • 无状态的服务或具有短生命周期的服务(例如,服务在每次调用时进行独立处理,并不需要维护任何持久化数据)。

2. Scoped(作用域)

  • 生命周期: 在每个请求或作用域内创建一个服务实例,并且在同一个请求或作用域中共享该实例。
  • 适用场景: 适用于需要在同一请求中共享实例的服务。典型场景是数据库上下文(DbContext)等。
  • 注册方式: services.AddScoped<TService, TImplementation>();

特点:

  • 在同一个 HTTP 请求或作用域中,共享同一个服务实例。
  • 适用于服务依赖于请求上下文或作用域(如数据库事务或用户会话数据)的场景。
  • 跨请求时会重新创建实例,但在同一个请求内不会重复创建实例。

示例:

复制代码

csharpCopy Code

public void ConfigureServices(IServiceCollection services) { services.AddScoped<IMyService, MyService>(); }

使用场景:

  • 每个用户请求共享同一个实例,但不同的请求之间的实例是隔离的。
  • 适用于数据库连接、用户请求处理等场景。

3. Singleton(单例)

  • 生命周期: 在整个应用程序生命周期内只创建一个实例,所有请求共享同一个实例。
  • 适用场景: 对象实例创建开销较大,或者需要在整个应用程序中共享数据或服务的场景。
  • 注册方式: services.AddSingleton<TService, TImplementation>();

特点:

  • 在整个应用程序运行期间,服务只有一个实例。
  • 适合跨请求共享数据,或者服务的实例化成本较高且不需要频繁变化的情况。
  • Singleton 服务可能会在应用启动时就被创建,或者首次被请求时才会创建。

示例:

复制代码

csharpCopy Code

public void ConfigureServices(IServiceCollection services) { services.AddSingleton<IMyService, MyService>(); }

使用场景:

  • 适用于跨多个请求需要共享数据的服务,如缓存、配置管理、日志记录等。
  • 常用于应用启动时需要初始化的单例服务。

4. 总结比较

生命周期类型 服务实例的创建频率 生命周期说明 适用场景
Transient 每次请求时创建 每次依赖注入都会新建一个实例 无状态服务、轻量级服务
Scoped 在每个请求内共享 在一个请求的整个生命周期中使用同一个实例 数据库上下文、事务、用户请求上下文等
Singleton 整个应用程序生命周期内共享 在应用程序生命周期中共享同一个实例 配置管理、缓存、日志服务等

5. 使用场景举例

  • Transient:数据库查询服务、HTTP客户端服务。
  • ScopedDbContext(通常每个请求使用一个数据库上下文)、身份验证服务。
  • Singleton:应用配置、缓存、日志记录、缓存管理器。

通过合理选择服务生命周期模式,可以在保证应用性能的同时,更好地管理对象的状态和生命周期。

相关推荐
qq_424098562 分钟前
HTML函数开发用窄边框笔记本有优势吗_便携与性能权衡【指南】
jvm·数据库·python
Wyz201210244 分钟前
CSS如何实现导航栏下划线随鼠标移动_利用-hover伪类与过渡动画控制
jvm·数据库·python
2201_761040595 分钟前
SQL如何统计每个用户的首次行为时间_MIN聚合与分组
jvm·数据库·python
亦暖筑序9 分钟前
Spring AI Alibaba 报错合集:我踩过的那些坑
java·后端
qq_1898070311 分钟前
mysql如何实现定时清理缓存数据_利用event scheduler执行
jvm·数据库·python
Polar__Star13 分钟前
golang如何实现低功耗设备唤醒机制_golang低功耗设备唤醒机制实现教程
jvm·数据库·python
a95114164215 分钟前
CSS怎么在flex布局中实现项目均分间距_设置justify-content space-evenly
jvm·数据库·python
石榴树下的七彩鱼18 分钟前
OCR 识别不准确怎么办?模糊 / 倾斜 / 反光图片优化实战(附完整解决方案 + 代码示例)
图像处理·人工智能·后端·ocr·api·文字识别·图片识别
2201_7610405921 分钟前
Golang如何做灰度发布_Golang灰度发布教程【实战】
jvm·数据库·python
小梦爱安全23 分钟前
SQL Server(Linux)安装
数据库·microsoft·sqlserver