domain-driven-design - 聚合之间的关联,如何决定是持有对对象的引用还是仅持有其标识
问题描述
例如,给一个有多个表演者的表演......
第一个选项:
Performance (1) ---> (*) Performer
第二种选择:
Performance
+PerformerIds[]
第一种选择优点:
- 更轻松地访问查询目的(假设我不想使用 CQRS)
- 当我们查看领域模型时似乎更容易理解,Performance 和 Performer 之间的关系更加明显
第一个选项缺点:
- Performance 对象的加载较重(可以通过延迟加载来修复)
- 更多耦合
第二个选项的利弊显然与第一个选项相反,更难从性能中获得表演者,模型图更难理解,负载更轻,耦合更少。
我有点喜欢第一个选项,因为 Performance 对象永远不会使用 Performer 对象。这种关系更像是数据关系/查询模型。但在我看来,它也使域模型图不太清晰,所以我不确定我是否应该使用哪种解决方案。
我的问题可能是我试图为领域专家和开发人员使用相同的类图吗?和/或建模主要用于查询而不是更新?
解决方案
如何决定是持有对对象的引用还是仅持有其身份
持有对相关聚合根 (AR) 身份的引用使其边界明确。
当然,每个 AR 仍然拥有对其所有实体的引用,但无论您引用聚合根还是实体,它在您的域模型中都变得非常明确。
- 如果您持有对相关聚合根 (AR) 的引用,则很容易跨越它们之间的界限。
- 同时更改几个聚合非常容易,特别是如果您使用 ORM 或实施了工作单元。因此,您的聚合根不再是事务边界。
- 如果您只持有相关聚合根 (AR) 的标识符,为了访问相关的 AR,您必须先从存储库加载它。这是一个权衡。当您跨越一个聚合的边界并查询另一个聚合时,它变得非常明确。
我不喜欢的是,当您查看类图时,您所看到的只是它们之间没有任何关联的单独聚合,这对于显示相关的域概念看起来不是很有用。
您的域模型是一个“模型”,由您来做出设计决策。
如果你所有的聚合根都很小,并且你使用了一个免费做很多魔法的 ORM(注意:总是有代价的),并且在类图上看到引用的价值大于看到边界的价值,然后尝试持有对相关 AR 的引用,即使您的代码并不真正需要它。
然后在一段时间内评估您的模型。
推荐阅读
- javascript - 使用 React 和 Redux 传播运算符错误
- python - *map 函数在 python 中的作用是什么?
- python - Python tkinter canvas自定义用户输入程序不起作用
- node.js - 块(缓冲区)从节点 js 中的文件(文本文件)的 ReadStreaming 中携带的数据量?
- c# - 2个数据库之间的MySQL同步
- vb.net - 简单的登录表单错误 VB 2010
- c - 无法在 c 中使用 exec 和 makeargv 运行 ./program
- c++ - 将 printf 更改为 cout 语句
- python - 在单击 python 模块中的命令后获取参数
- elm - 当类型为 Maybe a -> Svg Msg in Elm 的函数中没有任何内容时返回什么