Domain driven design 域驱动设计的正确实现

Domain driven design 域驱动设计的正确实现,domain-driven-design,Domain Driven Design,我有一个关于域驱动设计实现的重要问题。 在evans的书中,关于层架构的表示,域引用了基础设施层,这是最底层,但是我在Internet上的所有实现中看到相反,基础设施层引用了域层,可能是因为使用ORM实现了存储库模式。你们怎么看?有些人可能会有一个与埃文斯的书一模一样的例子。你确定你正确地看待了依赖关系吗?存储库并不完全是基础设施,它们位于域和数据访问层之间 正如Fowler的书《存储库》中所述 使用用于访问域对象的类似集合的接口在域和数据映射层之间进行调解 如果您使用的是数据库,或者如您所指出

我有一个关于域驱动设计实现的重要问题。
在evans的书中,关于层架构的表示,域引用了基础设施层,这是最底层,但是我在Internet上的所有实现中看到相反,基础设施层引用了域层,可能是因为使用ORM实现了存储库模式。你们怎么看?有些人可能会有一个与埃文斯的书一模一样的例子。

你确定你正确地看待了依赖关系吗?存储库并不完全是基础设施,它们位于域和数据访问层之间

正如Fowler的书《存储库》中所述

使用用于访问域对象的类似集合的接口在域和数据映射层之间进行调解

如果您使用的是数据库,或者如您所指出的,是ORM,那么您的存储库实现将引用ORM。通常,存储库是作为一个泛型类实现的,它“引用”域的唯一方式是使用基本的“实体”类作为泛型约束


通常,“按此”和“按那个”的数据检索查询是在存储库类中实现的,但这不是一个很好的实践。这项工作用于查询或规范,存储库应该能够执行这些查询或规范,而不需要知道它们的很多详细信息。

您看到的接口位于域中的示例(例如
UserRepository
),它们的实现位于基础架构中(例如
HibernateUserRepository
)正在将依赖项反转原理(DIP)应用于传统的分层体系结构

在传统的分层体系结构中,高层模块应该依赖于底层模块。如果我们看一下标准层的顺序,我们将拥有
域->基础结构

我们真的希望我们的域依赖于基础架构细节吗?通过应用DIP原理,我们反转了依赖关系,使基础设施依赖于域层,但它不依赖于具体化,而是依赖于抽象

下面是DIP原则的表述:

A.高级模块不应依赖于低级模块。两者都应该依赖于抽象

抽象不应该依赖于细节。细节应该取决于抽象

资料来源: