【发布时间】:2015-05-01 16:11:00
【问题描述】:
我有一个关于领域驱动设计的重要实施问题。 在埃文斯的书中层架构的表示上,域引用层基础设施这是最低层,但是我在互联网上的所有实现中看到相反,基础设施层引用域层,可能是因为使用 ORM 的存储库模式。大家对此怎么看?有人会举出一个与埃文斯的书完全一样的例子。
【问题讨论】:
我有一个关于领域驱动设计的重要实施问题。 在埃文斯的书中层架构的表示上,域引用层基础设施这是最低层,但是我在互联网上的所有实现中看到相反,基础设施层引用域层,可能是因为使用 ORM 的存储库模式。大家对此怎么看?有人会举出一个与埃文斯的书完全一样的例子。
【问题讨论】:
您看到的接口位于域中的示例(例如UserRepository)以及它们的实现位于基础架构中的示例(例如HibernateUserRepository)正在将依赖倒置原则 (DIP) 应用于传统的分层架构。
在传统的分层架构中,高层模块应该依赖于低层模块。如果我们查看标准层顺序,我们会得到Domain -> Infrastructure。
我们真的希望我们的域依赖于基础架构细节吗?通过应用 DIP 原则,我们反转了依赖关系,使 Infrastructure 依赖于 Domain 层,但它不依赖于具体化,而是依赖于抽象。
DIP 原则是这样规定的:
A.高级模块不应该依赖于低级模块。两者都应该依赖于抽象。
B.抽象不应该依赖于细节。细节应该取决于抽象。
来源:http://en.wikipedia.org/wiki/Dependency_inversion_principle
【讨论】:
您确定您正在正确查看依赖项吗?存储库并不完全是基础设施,它们位于您的域和数据访问层之间。
如 Fowler 的书中所述,存储库
使用类集合接口访问域对象,在域和数据映射层之间进行调解。
如果您使用的是数据库,或者如您所说的 ORM,您的存储库实现将引用 ORM。很多时候,存储库被实现为一个泛型类,它“引用”域的唯一方法是它使用基“实体”类作为泛型约束。
“by this”和“by that”的数据检索查询通常在存储库类中实现,但这不是一个很好的做法。这项工作是针对查询或规范,存储库应该能够在不了解它们的很多细节的情况下执行。
【讨论】: