2011-10-06 82 views
0

我正在学习DDD,并希望开始建模一个相当平凡的示例 - 博客应用程序。定义聚合根和之间的关系

我有点困惑的一个领域是定义聚合根。

这里是到目前为止我的模型:

Site 
    has many 
     Blog 
      has reference to Site 
      has many 
       Post 
        has reference to Blog 
        has Category 
        has many 
         Comments 

在这个例子中,我相信的唯一的事情就是注释是一个值对象,因为它使一个职位的范围之外没有任何意义。

但后来基于:

只有总根可直接与数据库查询得到。 其他一切必须通过遍历来完成。

我会倾向于使Site,Blog和Post ARs成为可能,因为我想直接获取它们,而不是遍历集合。

我意识到博客并不完全是一个复杂的领域模型,所以并不真正保证应用DDD,但我只是想了解这些类型的关系是如何建模的。

回答

2

这不是因为您有一个层次结构,您必须定义一个聚合。如果您在层次结构中保持不变,则集合构造将派上用场。

在您的示例中,假设您希望博客中的每个帖子都具有唯一的'slug'(Wordpress样式,以便标题显示在URL中)。只有'Blog'实体才能执行这个不变量。同样,在这种情况下,将它作为聚合并通过博客实体添加博文是有意义的。

另一个例子:您的网站可以是公共或私人的。这是Site实体的一个属性。因此,您必须确保使用遍历从聚合根访问帖子,因为只有网站可以授权您或不能访问基础对象。

如果您的网站的聚合根,你可以使用如下的URL结束:

http://site.com/myblog/apost

您的代码将首先检索该网站的实体,从实体它得到的博客,从博客实体获取帖子。你如何去取回孩子实体取决于你。此模型不会强制您在检索网站时加载内存中的所有博客文章。它只是迫使你从网站上检索博客,并从博客中发布帖子。