答案:MS DI轻量高效,适合标准ASP.NET Core项目;Autofac功能强大,支持属性注入、模块化和AOP,适用于复杂场景。

在C#开发中,依赖注入(Dependency Injection, DI)是实现松耦合、提升可测试性和可维护性的关键手段。而依赖注入容器则是管理服务生命周期和依赖关系的核心组件。目前最常用的两种DI容器是 Microsoft.Extensions.DependencyInjection(简称 MS DI)和 Autofac。下面从实现原理、使用方式和特性对比角度进行说明。
什么是依赖注入容器?
依赖注入容器是一个负责创建对象、解析依赖并管理其生命周期的框架。它通过注册服务类型与实现之间的映射,在运行时自动注入所需依赖。
基本流程包括:
- 注册:将接口与具体实现关联,并指定生命周期(瞬态、作用域、单例)
- 解析:根据请求类型创建实例,自动填充构造函数参数
- 释放:对于实现了 IDisposable 的服务,容器会在适当时候调用 Dispose
使用 Microsoft.Extensions.DependencyInjection
这是 ASP.NET Core 内置的轻量级 DI 容器,集成度高、性能好,适合大多数项目。
示例代码:
安装包:dotnet add package Microsoft.Extensions.DependencyInjection
注册与使用:
var services = new ServiceCollection(); // 注册服务 services.AddTransient(); services.AddScoped (); services.AddSingleton (); // 构建 ServiceProvider var serviceProvider = services.BuildServiceProvider(); // 解析服务 var service = serviceProvider.GetRequiredService (); service.DoWork();
优点:
- 与 ASP.NET Core 深度集成,开箱即用
- 轻量、高效,无额外依赖
- 支持泛型注册、工厂模式、枚举注入等常见场景
限制:
- 不支持属性注入和方法注入
- 无法按命名/键区分服务(如多个实现同一接口的服务)
- 缺乏高级功能如模块化注册、子容器、动态代理等
使用 Autofac
Autofac 是一个功能更强大的第三方 DI 容器,提供更灵活的控制和扩展能力。
示例代码:
安装包:dotnet add package Autofac
基本使用:
var builder = new ContainerBuilder(); // 注册服务 builder.RegisterType().As ().InstancePerDependency(); builder.RegisterType ().As ().InstancePerLifetimeScope(); builder.RegisterInstance(new Logger()).SingleInstance(); // 构建容器 var container = builder.Build(); // 解析服务 using var scope = container.BeginLifetimeScope(); var service = scope.Resolve (); service.DoWork();
Autofac 特性优势:
- 支持构造函数、属性、方法三种注入方式
- 支持命名服务、键控服务(Keyed Services),可区分多个实现
- 支持模块化注册(Module),便于组织大型项目配置
- 支持子生命周期(Nested Scopes),适用于复杂作用域场景
- 集成动态代理(如配合 Castle.Core 实现 AOP)
MS DI 与 Autofac 对比总结
| 特性 | Microsoft.Extensions.DependencyInjection | Autofac |
|---|---|---|
| 集成性 | ASP.NET Core 默认容器,无缝集成 | 需手动集成中间件或适配器 |
| 学习成本 | 简单直观,易于上手 | API 更丰富,有一定学习曲线 |
| 性能 | 高性能,轻量级 | 略低于原生,但差异不大 |
| 灵活性 | 基础功能完整,扩展有限 | 高度可定制,支持高级场景 |
| 属性注入 | 不支持 | 支持 |
| 模块化注册 | 需手动封装 | 原生支持 Module |
| AOP 支持 | 需结合其他库(如 Scrutor) | 通过 DynamicProxy 轻松实现 |
选择建议:
- 如果项目基于 ASP.NET Core 且需求标准,推荐优先使用 MS DI,简洁高效
- 若需要属性注入、多实现区分、AOP 或复杂的生命周期管理,Autofac 更合适
- 在已有 MS DI 的项目中引入 Autofac,可通过
Autofac.Extensions.DependencyInjection包桥接










