Architecture DDD Hexagon-在任何情况下,域层是否应该与基础架构(DAL)层对话?

Architecture DDD Hexagon-在任何情况下,域层是否应该与基础架构(DAL)层对话?,architecture,domain-driven-design,hexagonal-architecture,Architecture,Domain Driven Design,Hexagonal Architecture,据我所知,六边形体系结构的关键规则之一是域层如何与除应用层之外的所有事物隔离(域层位于核心,因此没有任何依赖性): 我的问题是,域层是否做过任何工作,或者是否有任何关于数据持久性的知识?假设我们有一些业务逻辑,这些逻辑依赖于数据的检索和持久化,那么它是否应该始终是协调这一过程的应用层呢 加载运行业务逻辑所需的所有内容-> 告诉域层运行所有业务逻辑-> 提取业务逻辑的结果并告诉基础架构层将其持久化-> 从这个意义上讲,应用程序层是否总是需要跟踪域层计算的任何结果,因此总是实现某种UnitOfWo

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

我的问题是,域层是否做过任何工作,或者是否有任何关于数据持久性的知识?假设我们有一些业务逻辑,这些逻辑依赖于数据的检索和持久化,那么它是否应该始终是协调这一过程的应用层呢

加载运行业务逻辑所需的所有内容-> 告诉域层运行所有业务逻辑-> 提取业务逻辑的结果并告诉基础架构层将其持久化->

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

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

假设我们有一些业务逻辑,这些逻辑依赖于数据的检索和持久化,那么是否应该始终由应用程序层进行编排

在理想化的设置中,您可以清楚地分离关注点:域模型使用本地内存中已有的信息来计算内容,应用程序代码协调从本地内存复制信息或将信息复制到本地内存

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

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

如果我们不一定事先知道我们需要的所有信息,那么这就变得更加棘手了。在这些情况下,您最终要在询问域模型需要什么信息、然后获取信息或向域模型传递查找信息本身的功能之间做出选择

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

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

分布式信息通常涉及故障模式,我们通常希望我们的域代码不被一堆故障管理逻辑弄得乱七八糟,就像我们通常不希望我们的域代码被一堆持久性问题所困扰一样

另见

假设我们有一些业务逻辑,这些逻辑依赖于数据的检索和持久化,那么是否应该始终由应用程序层进行编排

在理想化的设置中,您可以清楚地分离关注点:域模型使用本地内存中已有的信息来计算内容,应用程序代码协调从本地内存复制信息或将信息复制到本地内存

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

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

如果我们不一定事先知道我们需要的所有信息,那么这就变得更加棘手了。在这些情况下,您最终要在询问域模型需要什么信息、然后获取信息或向域模型传递查找信息本身的功能之间做出选择

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

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

分布式信息通常涉及故障模式,我们通常希望我们的域代码不被一堆故障管理逻辑弄得乱七八糟,就像我们通常不希望我们的域代码被一堆持久性问题所困扰一样

另见