考慮典型的博客與對象Post
和Comment
。應該發佈和評論是在帖子聚合還是應該他們自己的聚合?
對於我一直在建設的DDD演示示例,我(至今)發現實體Post
和Comment
適用於相同的聚合 - Post
聚合。但現在我不太確定..
在我的控制器,我發現,就像你所期望的,我需要添加並從Posts
刪除Comments
。用我目前的模型,我沒有跟蹤全球的Comment
的身份(就像藍皮書所建議的那樣)。你可能會想到,我的行動來刪除Comment
可能是這樣的:
public ActionResult DeleteComment(int postID, int commentID)
顯然我需要的Post
的ID從資源庫中,並在該Post
我想要的標識符特定Comment
檢索刪除。
我的問題是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
ID,如果我可以跟蹤全球Comment
。但是,如果我在全球跟蹤Comment
,它不應該有它自己的總量,那麼當Post
和Comment
似乎一起時它是正確的嗎?
我認爲帖子和評論是不同的聚合。例如,您可能希望在所有帖子中查詢評論。今天早上,Ayende Rahien(RavenDB作者)利用Post/Comment模型在文檔數據庫上進行了一次網絡研討會,並且讓他們分開了根,但有一個非正規化的查詢來顯示帶有評論的單個帖子。授予RavenDB網站顯示一個類似的模型與Post中的所有內容。我想你把它放在哪裏取決於你想用模型做什麼。 – Ryan 2011-02-25 06:18:31
@Ryan同意。而且我覺得它需要轉移到單獨的總量。我只是想確保我做的是正確的事情。當你說「這真的取決於你想用模型做什麼」 - 所有即時通訊的嘗試是在這個階段基本的AddPost,UpdatePost,DeletePost,AddComment和DeleteComment - 這個演示是簡單的,所以我可以理解DDD涉及的決定。 「非規範化查詢用於顯示帶有評論的單個帖子」:這是否意味着Post repo以「聚合」方式將帖子和評論一起返回的方式? – 2011-02-25 08:00:38
是的。您可以直接從您的服務/回購層中返回一個視圖模型,該模型的帖子及其相關評論。 – Ryan 2011-02-25 16:48:32