2013-05-04 124 views
2

我有以下DDD方案中,分为以下的聚集体:DDD:一到许多在其它聚集用户聚合根和几乎所有实体之间的关系

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

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

看起来好像我不应该将这里存在的所有一对多关联添加到用户实体,因为从数据库中提取水合物似乎很荒谬,特别是如果我尝试拉取与该关联的每条记录用户。对于组织集合和存储库以及处理给定实体的许多一对多关系的正确方法,建议采用什么策略?

回答

5

您在句子“用户与所有内容相关联......”中使用了“关联”一词这一事实是一个很有意思的事实。聚合根相关联,或者甚至是一个'属于'另一个,这绝对没有问题。但是,您需要查看一个实体是否可以在没有AR的情况下存在。如果可能的话,它可能有自己的生命周期,应该是一个AR。如果它不能它是聚合的一部分。这可能是棘手的提炼。

您需要在AR上有一个非常清晰的边界。例如,即使论坛可能要求用户创建它,但这并不意味着论坛需要(甚至可以)在用户被删除时被删除。因此,论坛中的用户可能变成仅包含用户名和ID的ForumCreator(值对象)。当用户被删除时,论坛可以继续存在。

在订单/订单行/产品方案中,如果您选择删除包含特定产品的所有订单行,则没有多大意义。我知道某个产品可能永远不会被删除,但我们将以此为例。您只需将相关产品数据“非标准化”到订单行中,例如:产品编号,产品名称。所以即使产品名称发生变化,并不意味着所有订单行都需要更新,甚至应该更新。实际上,订单行代表一个时间点,应保留“原始”产品名称。购买者可能已经订购了“某些lirril产品”,然后名称变为“小产品”。虽然它是完全相同的产品,但并不是一回事。购买者只能记住原件。

我希望这是有道理的,并以某种方式提供帮助。你一定需要找到你的对象图上的那些硬边以达到真正的聚合。

+0

对于用户聚合示例,我使用了Entity Framework POCO实体生成实用程序,并创建了User对象,并为它与其具有一对多关系的所有实体添加了IList <>属性。顺便说一句,我正在使用微软作为一个微型的orm。我是否应该删除IList <>属性条目,因为我宁愿从它们各自的存储库访问它们?在这种情况下,我应该从User实体中删除IList(一对多)关联,并且有权访问组通过GroupRepository而不是User存储库? – user1790300 2013-05-05 20:17:15

+0

我真的不知道EF,所以我不知道如何正确操作文件。对于这个问题,我不知道任何ORM :) --- w.r.t.用户 - >组它将取决于你的域名,但我猜测用户分组是多对多的,所以我会从用户中删除该列表。可能有用户所属的组ID的列表或包含ID和组名称的某个值对象(UserGroup)。 – 2013-05-06 04:47:08

+0

让我们从纯粹的实体和聚合视角来看待它,组织用户与朋友,文件,图库,消息,组,GroupMessages,GroupForums实体之间的关系的推荐方法是什么?对我来说,似乎应该在用户实体中没有IList条目,而是每个其他实体都应该包含用户实体的属性。 – user1790300 2013-05-06 12:42:32