【问题标题】:DDD: one-to-many relationship between user aggregate root and almost all entities in other aggregatesDDD:用户聚合根与其他聚合中几乎所有实体之间的一对多关系
【发布时间】:2013-05-04 20:31:11
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 对于用户聚合示例,我使用了 Entity Framework POCO 实体生成实用程序,它创建了 User 对象并为与其具有一对多关系的所有实体添加了 IList 属性。顺便说一句,我正在使用 dapper 作为一个 micro orm。我是否应该删除 IList 属性条目,因为我宁愿从它们各自的存储库中访问它们?在这种情况下,我是否应该从用户实体中删除 IList(一对多)关联并通过 GroupRepository 而不是用户存储库访问组?
    • 我真的不知道 EF 所以我不知道如何正确操作文件。就此而言,我不知道任何 ORM :) --- w.r.t. User->Groups 它将取决于您的域,但我猜用户到组是多对多的,所以我会从用户中删除该列表。可能有用户所属的组 id 列表或包含 id 和组名的值对象 (UserGroup)。
    • 让我们从纯实体和聚合的角度来看,组织用户与好友、文件、画廊、消息、组、GroupMessages、GroupForums 实体之间的关系的推荐方法是什么?对我来说,似乎每个用户实体中都不应该有 IList 条目,而是每个其他实体都应该包含用户实体的属性。
    • 我同意User 可能不应该有相关实体的列表,但我确实同意其他拥有User 的实体。您不希望在另一个实例中有 1 个 AR 的实例。而是使用相关 AR 的 ID 或代表 AR 的 VO(将包含 ID 和其他相关数据)。
    猜你喜欢
    • 2011-01-16
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 2019-06-29
    • 2021-12-27
    • 2020-01-30
    • 1970-01-01
    相关资源
    最近更新 更多