java - DDD - 实体与按功能打包
问题描述
假设,我们有 3 个聚合:
- 订单(“订单”包)
- 客户(“客户”包)
- 产品(“产品”包)
我现在要做的是使用 JPA/Hibernate 在“实体”级别连接所有这些聚合。但是这里出现了实体可访问性的另一个问题(它们必须是公共的)。遇到类似情况应该怎么办?
解决方案
您至少有 3 个选项。
让持久性信息传播到域实体中,因此持久性实体和域实体之间完全重叠。这也意味着,当没有简单的方法来处理它时,您必须使域适应持久性约束。例如,您管理一对多关系的方式。而且,正如您所指出的,您还需要将它们公开。
另一种选择是使用具有持久性信息的类来扩展域实体。这是可行的(我曾经做过一次),但是当域以意想不到的方式增长时,它就会变得一团糟。
另一种选择是拆分域和持久性实体。所以你有第一个存在于包中的包,应该放在基础设施层下,而其他包则保留在另一个包中,打开域层。通过这种方式,您可以隐藏所有域功能(kwnd 其他所有内容)并仅发布构建实体(例如构建器)所需的内容。另一方面,所有持久性细节都留在域之外。但是,您需要一种将域实体转换为持久性实体的方法,反之亦然。这是额外的工作,但好处是你可以测试每一件事,一旦它工作,它总是有效的。
最后,在现实世界中,您需要放松某些方面以使域适应您的基础架构要求/约束。
推荐阅读
- python-3.x - Python单元测试找不到模块
- react-tsx - “typeof React”类型上不存在属性“FC”
- apache-spark - Spark:Vectorassembler 抛出错误 org.apache.spark.SparkException:作业因阶段失败而中止:
- c# - 下面的表达式在 nodeJS 中的等价物是什么?
- java - zk 边框布局调整大小事件
- scala - 使用scalaj http库时如何提取SSO cookie
- java - 如何使用 Java ProcessBuilder API 运行交互式 bash?
- java - Java Eclipse 使用 mac Mojave 向上导出可运行的 .exe 文件
- laravel - Laravel错误尝试仅在部署时获取非对象的属性“日期”
- java - 以数组列表作为输入参数调用存储过程