依赖注入的理解

本文探讨了代码复用性和系统可维护性的问题,提出通过依赖注入实现系统解耦的方法,从而提升程序的可维护性和扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

若系统中一段代码被多个地方copy,说明系统逻辑可复用性做的不好,可维护性较差。

若系统中一段逻辑大量引用了非常多的类,系统需要依赖如此多的类,也会影响系统的可维护性,会造成程序耦合非常严重,不利于维护和扩展,这时候就需要一个容器,将这个类放到这些容器里去实例化,系统直接去容器里调用就行,我们从依赖类到依赖容器,实现了解耦,这就是我们说的依赖注入,也叫做控制反转。

### .NET 中的依赖注入概念和用法 依赖注入(Dependency Injection, DI)是一种在类及其依赖项之间实现控制反转(Inversion of Control, IoC)的技术。通过将依赖项从外部注入到类中,而不是让类自己创建这些依赖项,可以实现代码的松耦合,从而提高可测试性和可维护性[^2]。 在 .NET 中,依赖注入是框架内置的一部分,与配置、日志记录和选项模式一样重要。它提供了内置的依赖注入容器,用于管理对象的生命周期和依赖关系。以下是依赖注入的基本概念和用法: --- #### 1. 注册服务 在 .NET 应用程序中,需要在启动时配置依赖注入容器,并注册服务。对于 .NET 5 及之前的版本,通常在 `Startup.cs` 文件中完成;而对于 .NET 6 及之后的版本,则在 `Program.cs` 文件中进行配置。 以下是一个示例代码,展示如何注册服务: ```csharp var builder = WebApplication.CreateBuilder(args); // 注册服务到依赖注入容器 builder.Services.AddSingleton<ISingletonService, SingletonService>(); builder.Services.AddScoped<IScopedService, ScopedService>(); builder.Services.AddTransient<ITransientService, TransientService>(); var app = builder.Build(); app.Run(); ``` 上述代码中,`AddSingleton`、`AddScoped` 和 `AddTransient` 分别表示不同的生命周期管理方式[^1]。 --- #### 2. 生命周期管理 .NET 的依赖注入容器支持三种主要的服务生命周期: - **Singleton**:整个应用程序生命周期内只创建一个实例。 - **Scoped**:每个请求或作用域创建一个实例(常见于 Web 应用程序中的 HTTP 请求)。 - **Transient**:每次请求都会创建一个新的实例。 生命周期的选择取决于服务的具体需求和使用场景[^4]。 --- #### 3. 注入依赖项 依赖项可以通过构造函数注入、属性注入或方法注入的方式传递给类。 ##### 构造函数注入 这是最常用的方式,适用于强制依赖项的注入。 ```csharp public class MyController : Controller { private readonly IMyService _myService; public MyController(IMyService myService) { _myService = myService; } public IActionResult Index() { _myService.DoWork(); return View(); } } ``` ##### 属性注入 适用于可选依赖项的注入。 ```csharp public class MyService { [Inject] public IMyDependency MyDependency { get; set; } } ``` ##### 方法注入 适用于运行时动态变化的依赖项。 ```csharp public class MyService { public void SetDependency(IDependency dependency) { // 使用 dependency } } ``` --- #### 4. 高级模式 除了基本的依赖注入功能外,.NET 还支持一些高级模式,例如工厂模式、装饰器模式等。这些模式可以帮助解决复杂的依赖关系和服务初始化问题[^4]。 --- ### 示例代码 以下是一个完整的示例,展示如何在 .NET 中使用依赖注入: ```csharp public interface IMyService { void DoWork(); } public class MyService : IMyService { public void DoWork() { Console.WriteLine("Work is done!"); } } var builder = WebApplication.CreateBuilder(args); // 注册服务 builder.Services.AddTransient<IMyService, MyService>(); var app = builder.Build(); // 解析服务并调用 using (var scope = app.Services.CreateScope()) { var myService = scope.ServiceProvider.GetService<IMyService>(); myService?.DoWork(); } app.Run(); ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值