





















ServiceCollection 和 ServiceProvider 是 .NET 依赖注入系统中的两个核心概念,但它们的职责完全不同。理解这两个概念对看懂 ASP.NET Core / ABP 框架的 DI 机制非常重要。
下面用非常清晰、分层方式给你解释:
IServiceCollection 就是一个服务注册表,你把所有需要依赖注入的类型都注册到这里。
var services = new ServiceCollection();
services.AddSingleton<IMyService, MyService>();
services.AddTransient<IOtherService, OtherService>();
IServiceProvider 才是真正的 依赖注入容器,负责:
var provider = services.BuildServiceProvider();
var myService = provider.GetRequiredService<IMyService>();
IServiceScope 管理 Scoped 服务在 ABP 里,最终 DI 容器通常是 AutoFac 或 Castle Windsor(取决于版本)
但是概念一样:
| 阶段 | 在做什么 |
|---|---|
| Startup / Module PreConfigure | 注册服务(向 ServiceCollection 加东西) |
| Application startup | 构建 ServiceProvider |
| Runtime | Controller、Service、Repository 都从 ServiceProvider 获取依赖 |
像菜单一样,描述有哪些服务、用什么生命周期、怎么创建。
把菜单转换成真正的工厂,可以随时生产对象。
GetService() → 不报错GetRequiredService() → 找不到会报异常GetKeyedService() → 根据 Key 解析不同实现(.NET 7+)
| 角色 | 现实中的比喻 |
|---|---|
| ServiceCollection | 菜单(描述怎么做菜) |
| ServiceProvider | 厨房(真正做菜的地方) |
| AddSingleton/AddTransient | 菜谱写法 |
| GetService/GetRequiredService | 点菜(厨房做给你) |
[ServiceCollection] => 服务注册阶段
- IMail → MailService
- IConfig → ConfigService
- IOcr → BaiduOcr
BuildServiceProvider()
↓
[ServiceProvider] => 服务解析阶段
provider.GetRequiredService<IMail>()
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。