我有以下 DDD 场景,分为以下聚合:
User,
各位朋友(用户协会),
文件(供用户上传),
画廊(文件分组),
消息(用户通信),
群组(用户可以创建并且其他成员可以加入),
GroupMessages(发送给组中所有成员的消息),
群组论坛(群组成员可以讨论各种主题)
这就是令人困惑的地方。用户与低至群组论坛的一切都相关联。必须通过用户存储库才能访问其他聚合似乎不合逻辑,但从级联的角度来看,如果我删除用户,从技术上讲,与用户关联的记录也应该消失。
似乎我也不应该将此处存在的所有一对多关联添加到用户实体,因为从数据库中进行水合似乎很荒谬,特别是如果我尝试提取与用户关联的每条记录。组织聚合和存储库的推荐策略是什么,以及处理给定实体的大量一对多关系的正确方法是什么?
事实上,您在句子“用户与一切都相关......”中使用了“关联”一词,这是一个很好的线索。聚合根相互关联,甚至一个聚合根“属于”另一个聚合根,这绝对是好事。但是,您需要考虑一个实体是否可以在没有 AR 的情况下存在。如果可以的话,它可能有自己的生命周期,并且应该是 AR。如果不能,它就是聚合的一部分。这可能很难提炼。
您需要在 AR 周围有一个非常清晰的边界。例如,即使论坛可能需要用户创建它,但这并不意味着在删除用户时需要(甚至可以)删除论坛。因此,论坛中的用户可能会成为,比如说ForumCreator
(值对象)仅包含用户名和 ID。当用户被删除后,论坛可以继续存在。
在订单/订单行/产品场景中,如果您选择删除包含特定产品的所有订单行,则删除它没有多大意义。我知道某个产品可能永远不应该被删除,但我们将使用它作为示例。您只需将相关产品数据“非规范化”到订单行中,例如:产品 ID、产品名称。因此,即使产品名称发生更改,也不意味着所有订单行都需要更新,甚至应该更新。事实上,订单行代表一个时间点,“原始”产品名称应保留。购买者可能订购了“Some liril 产品”,然后名称更改为“Little 产品”。尽管它是完全相同的产品,但不是同一件事。购买者只记得原件。
我希望这是有道理的,并能在某种程度上有所帮助。您肯定需要找到对象图的硬边才能获得真正的聚合。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)