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

IServiceCollection和IServiceProvider

ServiceCollectionServiceProvider.NET 依赖注入系统中的两个核心概念,但它们的职责完全不同。理解这两个概念对看懂 ASP.NET Core / ABP 框架的 DI 机制非常重要。

下面用非常清晰、分层方式给你解释:


✔️ 一句话解释

  • ServiceCollection:用来“登记服务”(注册 DI 的地方),只是一本服务清单。
  • ServiceProvider:用来“提供服务”(从 DI 容器中取服务),是运行中的 IoC 容器。

✔️ 详细解释:ServiceCollection

它是什么?

IServiceCollection 就是一个服务注册表,你把所有需要依赖注入的类型都注册到这里。

常见用法:

var services = new ServiceCollection();services.AddSingleton<IMyService, MyService>();
services.AddTransient<IOtherService, OtherService>();

它的本质

  • 是一个 List
  • 存的是“如何创建服务”的描述信息
  • 不负责实例化对象
  • 在 ConfigureServices() 中使用

生命周期

  • 只存在初始化阶段
  • ASP.NET Core 启动的时候把它填满
  • 最终会被用来构建一个 ServiceProvider

✔️ 详细解释:ServiceProvider

它是什么?

IServiceProvider 才是真正的 依赖注入容器,负责:

  • 解析服务(Resolve)
  • 管理生命周期
  • 创建对象实例

常见用法:

var provider = services.BuildServiceProvider();var myService = provider.GetRequiredService<IMyService>();

它的本质

  • 根据 ServiceCollection 的描述,负责创建对象实例
  • 会管理 Singleton / Scoped / Transient 的生命周期
  • 是运行时一直存在的容器
  • ASP.NET Core 的 Controller 等都是从这里取依赖

生命周期

  • 创建后一直存在(直到程序停止)
  • Web 请求期间会生成子 IServiceScope 管理 Scoped 服务

✔️ ABP 和 ASP.NET 的不同点

在 ABP 里,最终 DI 容器通常是 AutoFac 或 Castle Windsor(取决于版本)

但是概念一样:

阶段 在做什么
Startup / Module PreConfigure 注册服务(向 ServiceCollection 加东西)
Application startup 构建 ServiceProvider
Runtime Controller、Service、Repository 都从 ServiceProvider 获取依赖

✔️ 为什么需要两者?(关键理解)

Step 1:先有服务清单(ServiceCollection)

像菜单一样,描述有哪些服务、用什么生命周期、怎么创建。

Step 2:再构建容器(ServiceProvider)

把菜单转换成真正的工厂,可以随时生产对象。

Step 3:运行期间用容器取服务

GetService() → 不报错
GetRequiredService() → 找不到会报异常
GetKeyedService() → 根据 Key 解析不同实现(.NET 7+)


✔️ 简易比喻

角色 现实中的比喻
ServiceCollection 菜单(描述怎么做菜)
ServiceProvider 厨房(真正做菜的地方)
AddSingleton/AddTransient 菜谱写法
GetService/GetRequiredService 点菜(厨房做给你)

✔️ 简易图示

[ServiceCollection]  => 服务注册阶段- IMail → MailService- IConfig → ConfigService- IOcr → BaiduOcrBuildServiceProvider()↓
[ServiceProvider]  => 服务解析阶段provider.GetRequiredService<IMail>()

http://www.jsqmd.com/news/41332/

相关文章:

  • multisim 13 Problem: Accessing the database解决办法
  • 完整教程:Redis 事务机制:Pipeline、ACID、Lua脚本
  • Python 一维数据、二维数据及 CSV 文件操作全解析(附实例)
  • 银行核心账户体系、账务设计、会计核心(整合版)
  • 斐波那契数列相关恒等式
  • Python 文件操作全面详解:从基础到进阶(附丰富实例)
  • 银行中外汇的由来(金融产品经理必读)
  • AI元人文框架:意义世界的探索引擎
  • abc432
  • 20232310 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • 实用指南:开源 Linux 服务器与中间件(七)数据库--MySQL
  • 版本控制与GitLab完整实践指南 - 指南
  • 利用Myo臂环采集肌电信号和角速度来建立实时手势识别
  • [MySQL] 基础操控
  • 公告栏
  • 做题笔记25
  • 云服务器部署Python后端偶遇`ImportError`: 从依赖版本到Python升级的排错全攻略 - 实践
  • 生物化学课程笔记
  • 20251115 - Hash
  • apache和nginx解析php和lnmp和lamp搭建
  • hippy字节都在用的前端主流框架
  • springboot多模块报错分析(一) - f
  • 身为大厂前端的你,不能不知道Babel + Polyfill!
  • 跨域问题解决方案汇总
  • Access-Control-Allow-Origin 在企业中的用法
  • VUE_basic - Ref
  • 详细介绍:像素退场,曲线登场:现代响应式 CSS 全家桶 | 领码课堂
  • HTTPS 究竟比 HTTP 好在哪?
  • 小苯的因子查询
  • 详细介绍:MongoDB 自动化脚本安装方案