依赖注入DI
在 .NET Core 中,依赖注入(Dependency Injection, DI)是一种设计模式,用于实现松耦合的代码结构。它通过将对象的依赖关系从代码中分离出来,使代码更易于测试、维护和扩展。
依赖注入的核心思想
依赖注入的核心思想是“控制反转”(Inversion of Control, IoC)。传统的程序设计中,类直接创建其依赖的对象;而在依赖注入中,依赖由外部提供给类,而不是由类自己创建。
这种模式的主要优点包括:
- 降低耦合度:类与其依赖之间的耦合度降低。
- 提高可测试性:可以通过注入模拟对象(Mock Objects)来测试类的行为。
- 增强灵活性:可以在运行时动态替换依赖。
依赖注入容器
.NET Core 提供了一个轻量级的依赖注入容器(IServiceProvider),用于管理依赖的注册和解析。
该容器支持三种主要的服务生命周期:
- Transient(瞬态):每次请求都会创建一个新的实例。
- Scoped(作用域):每个请求(如 HTTP 请求)只创建一个实例。
- Singleton(单例):整个应用程序生命周期内只有一个实例。
services.AddTransient<IService, Service>(); services.AddScoped<IService, Service>(); services.AddSingleton<IService, Service>();
声明周期解释
1. Transient:每次请求都会创建一个新的实例。适合无状态的服务。
2. Scoped:在同一个请求范围内共享一个实例。适合有状态的服务,例如数据库上下文。
3. Singleton:在整个应用程序生命周期内共享一个实例。适合全局状态或配置服务。
依赖注入的基本步骤
1. 注册服务
在 Startup.cs 文件的 ConfigureServices 方法中,或者在 Program.cs 文件中(对于 .NET 6+),需要将依赖的服务注册到容器中。例如:
public void ConfigureServices(IServiceCollection services) { services.AddTransient<IMyService, MyService>(); }
2. 解析依赖
在需要使用依赖的地方(如控制器或服务类中),通过构造函数注入的方式获取依赖。例如:
public class MyController : Controller { private readonly IMyService _myService; public MyController(IMyService myService) { _myService = myService; } public IActionResult Index() { var result = _myService.DoWork(); return View(result); } }
.NET Core 的框架会在运行时自动解析 IMyService 的实现,并将其注入到 MyController 中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)