DDD Hexagon——领域层是否应该在任何情况下与基础设施(DAL)层对话?

DDD Hexagon - Should the Domain Layer ever talk to the Infrastructure (DAL) Layer in any situation?

据我了解,六边形架构的关键规则之一是领域层如何与除与其一起工作的应用层之外的所有内容隔离(领域层完全没有依赖性,因为它位于核心中):

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

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

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

域层是否会与存储库或存储库的接口一起工作?有一些消息来源似乎表明这很好,这与我的观点完全矛盾。

Suppose we have some business logic which depends on data being retrieved and then persisted, should it always be the Application Layer which is orchestrating this?

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

表达方式略有不同:我们应该能够在完全不影响域模型实现的情况下更换所有管道。

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

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

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

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

分布式信息通常涉及故障模式,我们通常不希望我们的域代码被一堆故障管理逻辑弄得乱七八糟,这与我们通常不希望我们的域代码受到关注的方式大致相同有一堆持久性问题。

另见