数据访问层应该知道域吗?

Should the data access layer know the domain?

我们正在开发一个遵循领域驱动设计和分层软件架构的 Web 应用程序,具有以下层:

以上每一个都是一个单独的maven模块,具有向下依赖,i.d。表示取决于域和数据访问域。

数据访问层 return 域的实例 类 还是应该在域和数据访问层之间隔离?

DDD 中一种常见的持久性抽象是使用存储库模式。

您将在域中定义存储库的接口,并且合同将基于域概念。因此,是的,您将聚合根实体直接传递给存储库,查询方法也可以 return 直接聚合根。

请注意,存储库实现将存在于基础结构层中,而不是域中。

是的,您的基础架构层应该了解您所在领域的一切。具体存储库 类 通过提供所需的必要实现来支持您的抽象域接口。

您的基础架构层将依赖于您的领域层。

洋葱架构是一个很好的架构模式,可以帮助您进行域驱动设计。阅读 this article by Jeffery Palermo.

从长远来看,分离关注点总是更好。域接口用于域的客户端执行特定于域的任务,而数据访问层用于存储和检索对象 to/from 持久存储。如果域接口也用于持久性,实现细节很容易泄漏到域的接口中。

对我来说,DDD 的层更多地是关于public 接口(契约)的组织,而不是如何提供内部实现。从这个角度来看,内部实现是否在与 public 接口相同的程序集(因此层)中,或者提供依赖倒置并不重要。这些 - 以及实施的位置 - 仅仅是实施细节。