考虑带有对象的典型博客 Post
和 Comment
.
对于我一直在构建的 DDD 演示示例,我(直到现在)发现两个实体 Post
和 Comment
已适用于相同的聚合 - Post
总计的。但现在我不太确定..
在我的 Controller 中,正如您所期望的那样,我发现我需要添加和删除 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
来自与此类似的 repo ?:var comment = this._postRepo.CommentWithID(commentID)
..或者:
var comment = this._postRepo.CommentWithID(postID, commentID)
上面的两个例子可能看起来有点傻,因为我不需要
Post
如果我可以跟踪 Comment
的 ID全局。但是,如果我正在跟踪 Comment
在全局范围内,它不应该有自己的聚合,然后是正确的 Post
和 Comment
好像一起去?
最佳答案
正如其他人所说,这在很大程度上取决于评论是否在帖子之外具有任何意义。我倾向于认为确实如此,原因有几个。首先,从概念上讲,可以在普通博客引擎中对帖子以外的内容进行评论(例如,图像、新闻项目、另一条评论)。其次,正如也提到的,您经常会看到仅评论的小部件,这些小部件独立于他们的帖子。我还认为这种情况会使您为之苦恼的决定变得更加琐碎。
也就是说,如果您确实选择使它们成为一个聚合,那么请记住,在进行查询时,存储库通常会加载整个聚合,依靠缓存等机制来提高效率。因此,您的场景将是对帖子的查询,然后搜索该帖子的评论以查找“正确”评论以进行编辑/删除/任何操作。
关于asp.net-mvc - 帖子和评论应该在帖子聚合中还是应该是它们自己的聚合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5113886/