DDD - 实体与按功能包
DDD - entity vs package-by-feature
假设我们有 3 个聚合:
- 订单(“订单”包)
- 客户(“客户”包)
- 产品(“产品”包)
我现在要做的是使用 JPA/Hibernate 在“实体”级别连接所有这些聚合。但是这里又出现了实体可访问性的另一个问题(它们必须是 public)。遇到类似情况怎么办?
您至少有 3 个选项。
让持久性信息传播到域实体中,因此持久性实体和域实体之间存在完全重叠。这也意味着,当没有简单的方法来处理它时,您必须适应持久性约束的域。例如,您管理一对多关系的方式。而且,正如您所注意到的,您还需要使它们 public.
另一种选择是使用具有持久性信息的 类 扩展域实体。这是可行的(我已经做过一次)但是当域以意想不到的方式增长时它会变得一团糟。
另一种选择是拆分域和持久性实体。所以你有第一个存在于包中的,应该在基础设施层下,而其他的则留在另一个包中,不在域层中。通过这种方式,您可以隐藏所有域函数 kwnd 其他所有内容)并仅发布构建实体(例如构建器)所需的内容。另一方面,所有的持久性细节都在域之外。但是,您需要一种方法将域实体转换为持久性实体,反之亦然。这是额外的工作,但好处是您可以测试每一件事情,一旦它起作用,它就会一直起作用。
最后,在现实世界中,您需要放宽一些方面以使域适应您的基础架构 requirements/constraints。
假设我们有 3 个聚合:
- 订单(“订单”包)
- 客户(“客户”包)
- 产品(“产品”包)
我现在要做的是使用 JPA/Hibernate 在“实体”级别连接所有这些聚合。但是这里又出现了实体可访问性的另一个问题(它们必须是 public)。遇到类似情况怎么办?
您至少有 3 个选项。
让持久性信息传播到域实体中,因此持久性实体和域实体之间存在完全重叠。这也意味着,当没有简单的方法来处理它时,您必须适应持久性约束的域。例如,您管理一对多关系的方式。而且,正如您所注意到的,您还需要使它们 public.
另一种选择是使用具有持久性信息的 类 扩展域实体。这是可行的(我已经做过一次)但是当域以意想不到的方式增长时它会变得一团糟。
另一种选择是拆分域和持久性实体。所以你有第一个存在于包中的,应该在基础设施层下,而其他的则留在另一个包中,不在域层中。通过这种方式,您可以隐藏所有域函数 kwnd 其他所有内容)并仅发布构建实体(例如构建器)所需的内容。另一方面,所有的持久性细节都在域之外。但是,您需要一种方法将域实体转换为持久性实体,反之亦然。这是额外的工作,但好处是您可以测试每一件事情,一旦它起作用,它就会一直起作用。
最后,在现实世界中,您需要放宽一些方面以使域适应您的基础架构 requirements/constraints。