依赖倒置原则(Dependency Inversion Principle,DIP)规定:代码应当取决于抽象概念,而不是具体实现;这些抽象不应当依赖于细节;而细节应当依赖于抽象。
在完美世界里,应用程序的组件之间没有耦合关系或绑定关系。开发人员也能够改变自己希望改变的任何东西,而不需要担心在应用程序的其他地方出现缺陷,或者“不希望存在的负面影响”。令人悲伤的是,我们并不是生活在完美世界里。因此,组件需要相互绑定在一起,或者在某一点耦合,以构成实际应用程序。
类可能依赖于其他类来执行其工作(Employee 服务可能依赖于数据访问组件向数据存储中保存和检索员工信息)。但是,它们不应当依赖于该类的特定具体实现,而应当是它的抽象。也就是说,Employee 服务不知道(或不关心)正在使用哪个具体的数据访问组件——只有它的抽象或代码契约(或接口)支持那些用于保存和检索员工所需要的方法。 显然,这一概念会大大提高系统的灵活性。如果类只关心它们用于支持特定契约而不是特定类型的组件,就可以快速而轻松地修改这些低级服务的功能,同时最大限度地降低对系统其余部分的影响。在第6 章,还会看到如何利用这一概念来模拟这些依赖项,以进行测试。有时,需要向类中提供这一低级服务的具体实现,以便这个类能够完成自己的工 作。最常见的做法,特别是在.NET 中使用TDD 的开发人员,就是依赖项注入(DI)模式。