他们表示,改变域库和数据访问库之间的依赖关系方向将尊重 DIP。为何如此? DIP 的思想不就是松耦合吗?例如,一个库引用另一个库的接口而不是具体的定义?他们引用了端口和适配器或洋葱作为示例,但在我的域将数据发送到存储库的 .NET 项目中,它需要数据访问层的依赖项,因此我认为不可能以不同的方式建立依赖项。
是的,DIP 依赖于抽象而不是具体,这确实导致了松散耦合。它还通过允许编译时依赖项指向运行时依赖项的相反方向,“反转”程序中的控制流。
Bob Martin 在很多地方谈到了这个概念,例如在耶鲁大学管理学院的演讲中。
这是我们的模块
(可能是一个域模块)。这是我们的模块M
(可能是存储库模块)。它有一个名为N
的函数(可能是数据库读取)。 控制流程将从F
到M
调用N
。 但是,如果我有多态性,如果我有面向对象的语言...我的F
模块可以提及接口的名称并使用它来调用M
。F
模块将从该接口派生。N
并注意编译时依赖项发生了什么:它指向反对控制流。这就是多态性给你带来的。多态性使您能够创建一个调用另一个模块的模块,并且具有针对控制流而不是控制流的编译时依赖点。
指向控制流的依赖是从
N
到接口的继承依赖。因此,M
和N
都具有指向接口的编译时依赖项,即使运行时依赖项从M
(域)指向N
(存储库)。
这个概念的选择性应用定义了依赖倒置原则。