DDD Hexagon - 在任何情况下,域层都应该与基础设施 (DAL) 层通信吗?

问题描述

据我所知,六边形架构的关键规则之一是域层​​如何与除应用层之外的所有事物隔离(域层位于核心中,因此根本没有任何依赖关系):

enter image description here

我的问题是,域层是否做过任何工作或了解数据持久性?假设我们有一些业务逻辑依赖于被检索然后持久化的数据,它是否应该总是是编排这个的应用层

加载业务逻辑运行所需的一切 -> 告诉领域层运行所有的业务逻辑 -> 提取业务逻辑的结果并告诉基础设施层将它们持久化 ->

从这个意义上说,应用层是不是总是需要跟踪领域层计算的任何结果,因此总是实施某种 UnitOfWork 模式来跟踪这些结果?

域层是否可以与存储库或存储库的接口一起使用?有一些来源似乎表明这很好,从我的角度来看,这与图表完全矛盾。

解决方法

假设我们有一些业务逻辑依赖于被检索然后持久化的数据,是否应该总是由应用层来编排这个?

在理想化的设置中,您有明确的关注点分离:域模型使用本地内存中已有的信息计算事物,以及协调从/向本地内存复制信息的应用程序代码。

表达方式稍有不同:我们应该能够在完全不干扰域模型实现的情况下替换所有管道。

在简单版本中,我们立即知道本地需要什么信息,因此应用程序可以获取所有内容的副本,域模型计算更改,然后应用程序代码将本地更改复制到需要的位置。

>

如果我们不一定预先知道我们需要的所有信息,这会变得更加棘手。在这些情况下,您最终会做出选择:询问域模型它需要什么信息,然后获取它,或者将能力传递给域模型以查找信息本身。

您可能不会直接从域模型中使用 REPOSITORY - 不完全是;您更有可能看到域服务。换句话说,获取某些信息的能力可能有一些您作为参数传递给域模型的表示,以便它可以执行自己的查询。

注意:在 Evans 的原书中,域服务是在对域建模时出现的一种模式(第 5 章),其中存储库是一种出现在生命周期管理中的模式(第 6 章)。

分布式信息通常涉及故障模式,我们通常希望我们的域代码不要被一堆故障管理逻辑混乱,就像我们通常不希望我们的域代码关注一个一堆持久性问题。

另见