DDD:由另一个聚合根访问的聚合根

时间:2014-11-07 21:32:28

标签: c# domain-driven-design aggregateroot

我目前正在开发一个DDD应用程序,并且对如何处理一个似乎必须从另一个聚合根访问聚合根的场景感到困惑。以下是我的边界背景概述:

用户可以加入该网站并在他们感兴趣的主题上创建帖子。他们还可以创建组并发布特定于他们创建的组的帖子或发布给所有站点成员的帖子。用户还可以上传其个人资料页面的照片,以便其他人查看或上传word文档和pdf文件以与帖子相关联。用户可以允许其他用户加入他们的群组或仅邀请群组邀请。

用户(代表网站成员)
帖子(用户可以创建很多帖子)
文件(用户可以关联图像以显示在其个人资料页面上;将word文档或pdf与其帖子相关联)
组(用户可以创建其他用户可以加入的任意数量的组)

将这一点分开的正确方法是什么,我认为在这种情况下每个都是AR?

在这种情况下,似乎用户和其他AR之间存在FK重复关系,这种关联是否应该在Value对象或AR中表示?

由于文件AR似乎以FK类型关系连接到User和Post,我应该如何用AR或Value对象表示它?

One to many    
User -> Posts    
User -> File    
User -> Group    

One to many    
Posts -> File

1 个答案:

答案 0 :(得分:1)

在设计聚合根时,您必须问自己,这个实体定义的是什么,而不是该实体“拥有”的内容。例如,用户是否可以在没有帖子的情况下存在?我猜是的。因此,在这种情况下,帖子将是它自己的AR。在这种情况下,您只需要引用UserID。

您的大部分实体最终将成为AR。请记住,您在此处为业务问题建模解决方案,而不是数据库表。当我开始DDD时,这让我很烦恼。你必须问自己一些棘手的问题,比如为什么我的用户实体需要一组帖子?您可能只有一个业务规则,即第一个月只能有10个帖子(仅作为示例)。为此,您可以改为只有一个名为TotalPosts的int字段,并将所有集合丢失。现在,您不必加载可能数百个Post对象,只是为了加载用户。

总而言之,您希望您域中的AR主要仅通过ID引用彼此。您的域可能与您的数据库架构不匹配。对于您域中不同的有界上下文,可以使用相同AR的多个“版本”。