3

我有以下 DDD 场景,分为以下聚合:

User、
Friends(用户关联)、
File(用于用户上传)、
Galleries(文件分组)、
Messages(用户交流)、
Groups(用户可以创建,其他成员可以加入)、
GroupMessages(发送给组内所有成员的消息) )、
GroupForums(群组成员可以讨论各种话题)

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

似乎我也不应该将此处存在的所有一对多关联都添加到用户实体中,因为从数据库中补水似乎很荒谬,尤其是当我尝试提取与用户关联的每条记录时。组织聚合和存储库的推荐策略是什么,以及处理给定实体的大量一对多关系的正确方法是什么?

4

1 回答 1

9

您在句子“A user is associated with everything...”中使用了“关联”一词,这一事实非常有线索。聚合根被关联甚至一个“属于”另一个是绝对好的。但是,您需要查看一个实体是否可以在没有 AR 的情况下存在。如果可以的话,它可能有自己的生命周期,应该是一个 AR。如果不能,则它是聚合的一部分。这可能很难蒸馏。

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

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

我希望这是有道理的,并在某种程度上有所帮助。你肯定需要找到你的对象图的那些硬边才能得到真正的聚合。

于 2013-05-05T16:53:59.473 回答