domain-driven-design - 从 DDD 的角度来看,我可以拥有非聚合根的存储库吗
问题描述
在我目前的(JPA)项目中,我基本上有 2 个实体。ChainOfClassesA 和 ClassA。现在 ChainOfClassesA 基本上是 ClassA (@OneToMany) 和其他几个属性的双向列表。对我来说,ChainOfClassesA 似乎是一个聚合根,因此有专门的存储库。现在,一个用例是更新 ClassA。我知道我可以为 ClassA 创建存储库,但这会违反规则“每个根聚合实体一个存储库”,因为 ClassA 并不是真正的聚合根,尽管这暗示我它可能是,或者我应该“扁平化 ChainOfClassesA ”。
现在我的问题是我应该务实并“打破规则”并为 ClassA 创建专用存储库还是遵循规则并将 ChainOfClassesA 中的双向列表 @OneToMany 替换为 ClassA 中对 ChainOfClassesA 的 ID 引用。第一种方法是实用的,只需要一点工作,而后一种方法还需要对代码库进行一些其他更改。你怎么认为?特别是为什么我不应该为非聚合根创建存储库(除非那个人可能会使用该存储库以便不再满足事务边界)
解决方案
如果 ChainOfClassesA 是一个聚合 Root 并且它有一个 ClassA 的集合。如果您需要一个用例来更新 ClassA,您可以在 ChainOfClassesA 对象上定义一个方法。我看不出 ClassA 有任何理由引用 ChainOfClassesA,因为它只能在 ChainOfClassesA 的范围内使用。如果 EF 允许您这样做,则不一定意味着您应该这样做。如果您为每个 ClassA 定义一个 repo,则意味着它可以完全独立于自己的生命周期。并且所有其他聚合最终都与它一致。如果删除 ChainOfClassesA,ClassA 是否应该继续存在?如果是,那么 ClassA 可能应该是一个单独的聚合。
推荐阅读
- visual-studio-code - 如何在 VSCode 设置中设置不同的默认格式化程序?
- python - 如何减去两个矩形?
- javascript - 无法删除并在 router.delete 中找不到 404 错误
- matlab - Matlab:ODE45方程的参数拟合 - 只有xdata的初始值
- python - GRU(门控循环单元)不适用于 GPU(TensorFlow)
- javascript - 带有反引号的 JavaScript 模板文字不起作用
- pandas - 使用 PySimpleGUI 和 Pandas 制作表格
- java - Ljava.lang.Object;@5dfcfece 和快速排序
- python - 为什么没有定义问候功能以及如何更改代码
- javascript - 按属性过滤对象数组