DDD:用户聚合根与其他聚合中的几乎所有实体之间的一对多关系

时间:2013-05-04 20:31:11

标签: c# domain-driven-design ddd-repositories

我有以下DDD方案,分为以下聚合:

用户,
朋友(用户协会),
文件(供用户上传),
画廊(文件分组),
消息(用户通信),
组(用户可以创建和其他成员可以加入),
GroupMessages(发送给组中所有成员的消息),
GroupForums(小组成员可以讨论各种主题)

这是令人困惑的地方。用户与GroupForums的所有内容相关联。通过用户存储库访问其他聚合似乎不合逻辑,但从级联的角度来看,如果我删除用户,从技术上讲,与用户关联的记录也应该消失。

似乎我不应该将此处存在的所有一对多关联添加到用户实体,因为从数据库中保湿似乎是荒谬的,特别是如果我尝试拉出与用户关联的每个记录。组织聚合和存储库的推荐策略是什么,以及处理给定实体的大量一对多关系的正确方法?

1 个答案:

答案 0 :(得分:7)

您在句子“用户与所有事物相关联......”中使用“关联”一词这一事实非常明显。对于聚合根来说,或者甚至对于一个“属于”另一个根来说,这是完全正确的。但是,您需要查看实体是否可以在没有AR的情况下存在。如果可能,它可能有自己的生命周期,应该是AR。如果它不能,它就是聚合的一部分。这可能很难提炼。

你需要在你的AR周围有一个非常明确的界限。例如,即使论坛可能要求用户创建它,但这并不意味着在删除用户时需要(或甚至可以)删除论坛。因此,论坛中的用户可能会成为仅包含用户名和ID的ForumCreator(值对象)。删除用户后,论坛可以继续存在。

在Order / OrderLine / Product方案中,如果您选择删除包含特定产品的所有订单行,那么删除所有订单行没有多大意义。我知道可能永远不会删除产品,但我们会以它为例。您只需将相关的产品数据“非规范化”到订单行中,例如:产品ID,产品名称。因此,即使产品名称恰好发生变化,也并不意味着所有订单行都需要更新,甚至不应该更新。实际上,订单行代表一个时间点,应保留“原始”产品名称。购买者可能已经订购了“一些lirril产品”,然后将名称改为“Little product”。虽然它是完全相同的产品,但不一样。购买者只记得原件。

我希望这在某种程度上有意义并有所帮助。你肯定需要找到对象图的那些硬边来获得真实的聚合。

相关问题