惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
云风的 BLOG
云风的 BLOG
Martin Fowler
Martin Fowler
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
量子位
Engineering at Meta
Engineering at Meta
博客园 - 叶小钗
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
罗磊的独立博客
B
Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
U
Unit 42
Microsoft Azure Blog
Microsoft Azure Blog
D
Docker
N
Netflix TechBlog - Medium
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog RSS Feed
I
InfoQ
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
V2EX

博客园 - 大西瓜3721

基于 .NET 的 FluentValidation 验证教程 C#.NET 仓储模式详解 SVN分支/合并原理及最佳实践 Web.Config中Runtime节点-DLL版本冲突问题 工作问题 Vue资料 轻松实现WCF服务的构造函数依赖注入 WCF 依赖注入-- Attribute MVC视图分析 C#简单枚举和标志枚举的用法和区别 XDate Admin.NET框架资料 日志管理之log4net+Autofac 关于NopCommerce3.6版用户登录详解 AutoFac注册的动态实例 Named和Keyed NOP源码分析 六 NOP源码分析五---set的存储 NOP源码分析四 Nop源码分析三 NOP源码分析 二 NOP源码分析 一 NopCommerce的资料 控制反转——Autofac框架 精选10款C#/.NET开发必备类库 11个免费开源后台管理系统模板 H5连接蓝牙打印机打印小票 自定义控件 - 流式布局:TagFlowLayout MVC开源CMS nginx的安装&一个最简单的配置(windows和Centos) DNS解析
IServiceCollection和IServiceProvider
大西瓜3721 · 2026-03-13 · via 博客园 - 大西瓜3721

NETCore依赖注入(一)     NETCore依赖注入(二)

ServiceCollection 和 ServiceProvider 是 .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 → BaiduOcr

           BuildServiceProvider()
                  ↓
[ServiceProvider]  => 服务解析阶段
   provider.GetRequiredService<IMail>()