





















依赖注入 是一种设计模式,它把创建和管理对象依赖关系的控制权,从对象内部反转到外部容器。核心思想是“别找我,我会给你”。
用一个生活中的比喻来理解:
你想开一家咖啡店(CoffeeShop类),需要一台咖啡机(CoffeeMaker)。
传统方式(硬编码/内部创建):
你自己去买零件、看说明书、组装一台咖啡机。咖啡店和这台特定咖啡机强绑定了。
代码体现:在 CoffeeShop的构造函数里 new EspressoMachine()。
依赖注入方式:
你告诉一个“大管家”(DI容器):“我需要一台咖啡机,这是我的要求(接口)”。大管家会去它的仓库里,找来一台符合要求的咖啡机(可能是 EspressoMachine,也可能是 DripCoffeeMaker)装好,送到你店里。
你不关心咖啡机从哪来、怎么造的,只管用就行了。
代码体现:CoffeeShop的构造函数声明需要一个 ICoffeeMaker接口的参数,外部(容器)负责传入一个具体的实现(如 EspressoMachine)。
依赖:一个对象正常工作所需要的其他对象(如 CoffeeShop依赖 CoffeeMaker)。
注入:由外部(通常是DI容器)在创建对象时,将依赖传递给它。主要注入方式:
构造函数注入(最推荐):通过构造函数参数传入。保证了对象在创建后就是完整的、可用的。
属性/Setter注入:通过公开的属性设置。对象可能在某个阶段依赖不完整。
方法注入:通过特定方法的参数传入。
解耦:CoffeeShop不依赖具体的 EspressoMachine,只依赖 ICoffeeMaker接口。想换咖啡机品牌?只需配置容器,不用改 CoffeeShop的代码。符合“依赖倒置”原则。
可测试性:在单元测试时,可以轻松传入一个“模拟咖啡机”(Mock对象)来测试 CoffeeShop的行为,而不需要真的启动一台咖啡机。
可维护性:所有对象的创建和依赖关系在一个地方(容器)集中管理,就像一份“装配说明书”,清晰明了。
生命周期管理:容器可以帮你管理对象的生命周期(如单例、每次请求新建一个)。
没有DI(强耦合,难测试):
public class CoffeeShop {
private EspressoMachine _machine;
使用DI(解耦,易测试):
// 1. 定义接口
public interface ICoffeeMaker {
void Brew();
}
在现代框架(如 Spring, .NET Core, Angular 等)中,都有一个IoC容器(控制反转容器)来自动帮你完成依赖注入。
注册:你告诉容器:“遇到 ICoffeeMaker请求时,给一个 EspressoMachine实例”。
解析:当你需要一个 CoffeeShop时,容器会自动创建 EspressoMachine,再创建 CoffeeShop并把咖啡机“注入”给它。
一句话总结:依赖注入是一种“将对象的组装和使用分离”的模式。它的核心价值在于解耦和提升可测试性,是现代软件架构的基石之一。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。