当前位置: 首页 > news >正文

C# 容器实例生命周期

在 C#(特别是结合 .NET 的依赖注入容器,如 ASP.NET Core 内置的 DI 容器)中,服务(或组件)的生命周期主要有三种:Transient(瞬态)Scoped(作用域)Singleton(单例)。这些生命周期决定了服务实例何时被创建、重用以及销毁。

以下是它们的区别和适用场景:


1. Transient(瞬态)

  • 每次请求都创建一个新实例
  • 适用于轻量级、无状态的服务。
  • 优点:隔离性好,不会因状态共享引发问题。
  • 缺点:频繁创建/销毁可能影响性能(尤其对重量级对象)。
services.AddTransient<IMyService, MyService>();

每次从 DI 容器解析 IMyService 时,都会返回一个全新的 MyService 实例。


2. Scoped(作用域)

  • 在同一个作用域内共享同一个实例,不同作用域使用不同实例。
  • 在 ASP.NET Core 中,一个 HTTP 请求就是一个作用域
  • 适用于需要在一次请求中共享状态的服务(如数据库上下文 DbContext)。
services.AddScoped<IMyService, MyService>();

在同一个 HTTP 请求中多次解析 IMyService,会得到同一个实例;但在不同请求中会得到不同实例。

⚠️ 注意:在非 Web 应用(如控制台程序)中,需要手动创建作用域(通过 IServiceScopeFactory)才能体现 Scoped 行为。


3. Singleton(单例)

  • 整个应用程序生命周期内只创建一个实例,所有请求共享该实例。
  • 适用于全局共享、无状态或线程安全的服务。
  • 优点:节省资源,避免重复初始化。
  • 风险:如果服务持有可变状态,需确保线程安全。
services.AddSingleton<IMyService, MyService>();

整个应用运行期间,无论多少次解析 IMyService,都返回同一个实例。


对比总结

生命周期创建时机实例数量适用场景
Transient每次请求时每次都新实例轻量、无状态、临时对象
Scoped每个作用域首次请求时每个作用域一个实例Web 请求内共享(如 DbContext)
Singleton首次请求时(或启动时)全局唯一实例全局配置、缓存、日志等

补充说明

  • 不能从短生命周期服务注入长生命周期服务(例如:Singleton 服务中注入 Scoped 服务是危险的,因为 Scoped 服务可能依赖于请求上下文,而 Singleton 存活时间更长,会导致“捕获作用域外服务”的异常)。
  • 反之,长生命周期可以安全地注入短生命周期服务(但通常不推荐,因为短生命周期服务可能无法按预期工作)。

示例(ASP.NET Core)

// Program.cs 或 Startup.cs
builder.Services.AddTransient<IOperationTransient, Operation>();
builder.Services.AddScoped<IOperationScoped, Operation>();
builder.Services.AddSingleton<IOperationSingleton, Operation>();

配合一个测试控制器,你可以观察到 GUID(代表实例 ID)的变化情况,验证不同生命周期的行为。


如有使用第三方容器(如 Autofac、Unity 等),概念类似,但 API 可能略有不同。不过 ASP.NET Core 默认 DI 容器已能满足大多数场景。

http://www.dtcms.com/a/610926.html

相关文章:

  • OFD(Open File Description)
  • LLM思维链提示(CoT)
  • 重庆网站建设快速建站中山优秀网站建设
  • 【愚公系列】《MCP协议与AI Agent开发》011-MCP协议标准与规范体系(交互协议与状态码体系)
  • 算法学习--快速幂
  • 快速排序简要介绍
  • 阆中 网站建设html网页制作小刘在线课程
  • 无锡网站建设无锡速联科技做网站首页可以用传媒公司吗
  • 建站公司网站 phpwind自己做的网站怎么给别人访问
  • 百度世界2025|实时互动数字人智能体让搜索更懂人心
  • 每个城市建设规划在哪个网站做it的中国企业网站
  • 中国工程建设标准化协会网站wordpress登录注册
  • dB 及 dBm、dBc、dBi、dBd 等相关单位的定义、计算公式、应用场景及区别
  • 企业级管理系统的站内信怎么轻量级优雅实现
  • 门户网站网站建设wordpress页面分类插件
  • 网站建设培训学费互联网做网站
  • Visual C++ 6.0 中文版安装包下载及 Win11 安装教程
  • 免费的资料网站取消工法建设部网站
  • PostgreSQL 大表字段回填最佳实践:高并发无锁更新 + 分批提交 + 完整进度显示
  • STM32_标准库转hal库
  • 织梦怎么做单页网站创建网站的工作流程
  • 做网站流量是什么上海制作网站的公司
  • PHP安装ZSTD压缩库扩展
  • 完美解决phpstudy安装后mysql无法启动
  • 新能源知识库(124)新能源接入对电能质量的影响
  • 磁共振成像原理(理论)28:饱和恢复序列 (Saturation-Recovery Sequence)
  • 桂林网站开发公司电话2345网址导航怎么彻底删掉win10
  • 网站册数平面设计可以自学吗
  • Boost库中Boost.PropertyTree使用和实战示例
  • 公司网站维护建设费入什么科目广东华电建设股份有限公司网站