.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.AddTransient();
services.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 时,容器会自动返回 EfRepository 实例。
也可借助反射或第三方库(如 Scrutor)批量注册服务,实现类似“程序集扫描”功能:
services.Scan(scan => scan
.FromAssemblyOf()
.AddClasses(classes => classes.AssignableTo())
.AsImplementedInterfaces()
.WithTransientLifetime());
基本上就这些。.NET 的依赖注入机制简洁实用,配合约定和少量配置就能支撑大多数应用开发需求。关键是理解生命周期管理与注入方式的选择,避免内存泄漏或状态错乱问题。
以上就是.NET如何实现依赖注入(Dependency Injection)_依赖注入实现方案的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1441125.html
微信扫一扫
支付宝扫一扫