在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<IService, Service>(); services.AddScoped<IRepository, Repository>(); services.AddSingleton<ILogger, Logger>(); // 构建 ServiceProvider var serviceProvider = services.BuildServiceProvider(); // 解析服务 var service = serviceProvider.GetRequiredService<IService>(); service.DoWork();
优点:
与 ASP.NET Core 深度集成,开箱即用 轻量、高效,无额外依赖 支持泛型注册、工厂模式、枚举注入等常见场景限制:
不支持属性注入和方法注入 无法按命名/键区分服务(如多个实现同一接口的服务) 缺乏高级功能如模块化注册、子容器、动态代理等使用 Autofac
Autofac 是一个功能更强大的第三方 DI 容器,提供更灵活的控制和扩展能力。
示例代码:
安装包:
dotnet add package Autofac
基本使用:
var builder = new ContainerBuilder(); // 注册服务 builder.RegisterType<Service>().As<IService>().InstancePerDependency(); builder.RegisterType<Repository>().As<IRepository>().InstancePerLifetimeScope(); builder.RegisterInstance(new Logger()).SingleInstance(); // 构建容器 var container = builder.Build(); // 解析服务 using var scope = container.BeginLifetimeScope(); var service = scope.Resolve<IService>(); 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包桥接 基本上就这些。两者都能很好地支持依赖注入,关键是根据项目复杂度和团队熟悉度做权衡。
