考虑包含对象Post
和Comment
的典型博客。
对于DDD演示示例,我一直在构建(到现在为止)发现实体Post
和Comment
都适用于相同的聚合 - Post
聚合。但现在我不太确定......
在我的控制器中,我发现,正如您所期望的那样,我需要在Comments
中添加和删除Posts
。在我目前的模型中,我没有全球跟踪Comment
的身份(就像蓝皮书建议的那样)。您可能希望我删除Comment
的操作可能如下所示:
public ActionResult DeleteComment(int postID, int commentID)
显然,我需要Post
的id来从存储库中检索它,以及我要删除的Comment
上特定Post
的标识符。
我的问题是DeleteComment(
行动的主体:
使用查询机制遍历Post
是否可以删除Comment
?像这样:
var comment = this._postRepo.WithID(postID).Comments
.SingleOrDefault(c => c.ID == commentID);
this._postRepo.Delete(comment);
return RedirectToAction("detail", new { id = postID });
..或者我应该从回购中选择类似于此的Comment
?:
var comment = this._postRepo.CommentWithID(commentID)
..或:
var comment = this._postRepo.CommentWithID(postID, commentID)
如果我可以全局跟踪Post
,上面的两个示例可能看起来有点傻,因为我不需要Comment
ID。但是,如果我在全球范围内跟踪Comment
,那么它不应该拥有它自己的聚合,那么当Post
和Comment
似乎在一起时它是正确的吗?
答案 0 :(得分:3)
在我看来,评论应该是Post Aggregate的一部分,但评论应该是实体,bcoz两条评论同样的答案仍然是两个单独的评论。
如果您将注释创建为单独的聚合,其中注释是root,则注释将具有存储方法,这意味着任何正文都可以创建注释但基本的想法是注释不应该在没有其post.Comment与post相关的情况下创建。
如果你从逻辑上思考,评论不能发展它自己。这意味着当创建评论时,它应该是帖子的一部分。
答案 1 :(得分:2)
正如其他人所说,这在很大程度上取决于评论在帖子之外是否有任何意义。出于几个原因,我倾向于认为它确实存在。首先,可以在概念上在普通博客引擎(例如,图像,新闻项,另一评论)中评论除帖子之外的事物。其次,正如同时提出的那样,您经常会看到仅仅是评论的小部件,这些评论与帖子无关。我也认为这种情况会使你所做的决定变得更加微不足道。
也就是说,如果您确实选择将它们作为一个聚合,那么请记住,存储库通常会在进行查询时加载整个聚合,依赖缓存等机制来提高效率。因此,您的方案将是对帖子的查询,然后搜索该帖子对“正确”评论的评论以编辑/删除/其他。
答案 2 :(得分:1)
问题是评论是否在帖子聚合之外有任何意义。恕我直言,没有,所以我认为你不应该把评论移到自己的聚合。