.NET 内置依赖注入容器通过 IServiceCollection 注册服务,支持 Transient、Scoped、Singleton 三种生命周期,推荐构造函数注入实现解耦,可结合 Scrutor 等库实现泛型注册与程序集扫描,有效降低类间耦合。

.NET 中的依赖注入(Dependency Injection, DI)是一种设计模式,用于实现控制反转(IoC),降低类之间的耦合度。.NET(特别是 .NET Core 及以后版本)内置了轻量级的依赖注入容器,开发者无需引入第三方框架即可完成大多数场景下的服务注册与解析。
内置 DI 容器的基本使用
.NET 提供了 IServiceCollection 和 IServiceProvider 接口来支持依赖注入。在项目启动时(如 Program.cs 或 Startup.cs 中)注册服务,运行时由容器自动注入。
常见服务生命周期包括:
- Transient:每次请求都创建新实例
- Scoped:每个作用域内共享一个实例(如一次 HTTP 请求)
- Singleton:整个应用程序生命周期中只创建一个实例
示例代码:
services.AddTransientservices.AddScoped
services.AddSingleton
构造函数注入:最常用的方式
依赖通过构造函数参数传入,由运行时容器自动解析并实例化。这是推荐的做法,便于测试和解耦。
例如:
public class OrderController : ControllerBase{
private readonly IOrderService _orderService;
public OrderController(IOrderService orderService)
{
_orderService = orderService;
}
}
只要 IOrderService 已在 IServiceCollection 中注册,运行时就会自动注入其实现。
支持属性注入和方法注入(需额外配置)
.NET 内置容器原生只支持构造函数注入。若想使用属性注入,需结合第三方容器或手动实现。
例如使用 Autofac、Microsoft.Extensions.DependencyInjection.Extensions 扩展等方式实现:
- Autofac 支持 Property Injection
- 通过 ActivatorUtilities 可实现部分场景下的字段/属性动态填充
但通常建议坚持构造函数注入,保持清晰的依赖关系。
注册泛型类型和服务发现
对于泛型接口和实现,可直接注册:
services.AddTransient(typeof(IRepository), typeof(EfRepository));这样当请求 IRepository
也可借助反射或第三方库(如 Scrutor)批量注册服务,实现类似“程序集扫描”功能:
services.Scan(scan => scan.FromAssemblyOf
.AddClasses(classes => classes.AssignableTo
.AsImplementedInterfaces()
.WithTransientLifetime());
基本上就这些。.NET 的依赖注入机制简洁实用,配合约定和少量配置就能支撑大多数应用开发需求。关键是理解生命周期管理与注入方式的选择,避免内存泄漏或状态错乱问题。










