我正在学习DDD,并希望开始建模一个相当简单的例子,一个博客应用程序。
我有点困惑的一个方面是定义聚合根。
到目前为止,这是我的模型:
Site
has many
Blog
has reference to Site
has many
Post
has reference to Blog
has Category
has many
Comments
在这个例子中,我唯一确定的是,Comment是一个值对象,因为它在帖子的上下文之外没有任何意义。
但后来基于:
只能使用数据库查询直接获取聚合根。 其他一切都必须通过遍历完成。
我倾向于制作网站,博客和邮政AR,因为我想直接获取它们而不是遍历集合。
我意识到博客并不是一个复杂的领域模型,因此并不真正保证应用DDD,但我只是想了解这些类型的关系是如何建模的。
答案 0 :(得分:2)
这不是因为您有一个必须定义聚合的层次结构。如果您在层次结构中保持不变,聚合构造将会派上用场。
在您的示例中,假设您希望博客中的每个帖子都具有唯一的“slug”(Wordpress样式,以便标题显示在URL中)。只有“博客”实体才能强制执行此不变量。同样,在这种情况下,将它作为聚合并通过博客实体添加帖子是有意义的。
另一个例子:您的网站可以是公开的也可以是私有的。这是Site实体的属性。因此,您必须确保使用来自聚合根目录的遍历来访问帖子,因为只有站点可以授权您访问基础对象。
如果您将网站设为聚合根,则最终可能会显示以下网址:
您的代码将首先检索网站实体,从该实体获取博客,并从博客实体获取帖子。如何检索子实体取决于您。检索站点时,此模型不会强制您在内存中加载所有博客帖子。它只是强迫您从网站上检索博客,以及博客中的帖子。