4

考慮典型的博客與對象PostComment應該發佈和評論是在帖子聚合還是應該他們自己的聚合?

對於我一直在建設的DDD演示示例,我(至今)發現實體PostComment適用於相同的聚合 - 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,它不應該有它自己的總量,那麼當PostComment似乎一起時它是正確的嗎?

+2

我認爲帖子和評論是不同的聚合。例如,您可能希望在所有帖子中查詢評論。今天早上,Ayende Rahien(RavenDB作者)利用Post/Comment模型在文檔數據庫上進行了一次網絡研討會,並且讓他們分開了根,但有一個非正規化的查詢來顯示帶有評論的單個帖子。授予RavenDB網站顯示一個類似的模型與Post中的所有內容。我想你把它放在哪裏取決於你想用模型做什麼。 – Ryan 2011-02-25 06:18:31

+0

@Ryan同意。而且我覺得它需要轉移到單獨的總量。我只是想確保我做的是正確的事情。當你說「這真的取決於你想用模型做什麼」 - 所有即時通訊的嘗試是在這個階段基本的AddPost,UpdatePost,DeletePost,AddComment和DeleteComment - 這個演示是簡單的,所以我可以理解DDD涉及的決定。 「非規範化查詢用於顯示帶有評論的單個帖子」:這是否意味着Post repo以「聚合」方式將帖子和評論一起返回的方式? – 2011-02-25 08:00:38

+0

是的。您可以直接從您的服務/回購層中返回一個視圖模型,該模型的帖子及其相關評論。 – Ryan 2011-02-25 16:48:32

回答

1

問題是評論在帖子聚合之外是否有任何意義。恕我直言,沒有任何,所以我認爲你不應該將評論移動到自己的聚合。

+0

同意。那麼在控制器示例中獲得'Comment'實例的解決方案是什麼? – 2011-02-26 01:04:45

+0

我認爲郵政實體應該有一個RemoveComment方法,該方法從評論集合中刪除具有給定ID的評論。 比你應該這樣做: 加載郵政實體, call post.RemoveComment(commentId), 更新帖子 – ItayMaoz 2011-02-26 10:38:35

+0

Post'實體上的'RemoveComment'方法優先於簡單地使用'Post 「評論」集合的「添加」和「刪除」方法?然後讓Repo更新'Post'?或者從「Post」中「刪除」更合乎邏輯?因爲如果這是真的,那麼我想要儘可能多地控制聲明 - 在這種情況下,可能有「評論」作爲Enumerable而不是集合,所以「添加」和「刪除」不存在作爲選項權利? – 2011-02-28 02:05:54

3

在我看來,評論應該是Post Aggregate的一部分,但評論應該是實體,bcoz兩個評論用相同的答案還是兩個單獨的評論。

如果您將評論創建爲單獨的聚合,其評論爲根,那麼評論將具有存儲方法,這意味着任何主體都可以創建評論,但基本思想是評論不應該在沒有其帖子的情況下創建。評論與帖子相關。

如果您認爲邏輯上,評論不能發展它自己的。這意味着當評論被創建時,它應該是帖子的一部分。

+0

完全同意。那麼我怎樣才能查詢/遍歷Repo/Post聚合中的'Comment'? – 2011-02-26 01:04:02

+0

類別發佈{public列表評論{get; set;},您應該從數據庫中加載帖子以及存儲庫中基礎結構層中的所有評論。你如何加載帖子,無論是來自nhibernate還是來自Ef都完全在你身上。請使用工廠重新構建數據庫中的郵政聚合。 – kamal 2011-02-26 11:05:58

+0

要從帖子中刪除評論,你應該在Post中使用方法如DeletComment(id),現在如果你從帖子中刪除了4條評論,那麼你在刪除 – kamal 2011-02-26 11:09:05

2

正如其他人所說,這很大程度上取決於評論是否在郵政之外有任何意義。我傾向於認爲它確實有幾個原因。首先,除了帖子以外的東西可以從概念上在正常的博客引擎(例如圖像,新聞項目,另一評論)中進行評論。其次,同樣如此,您經常會看到只有評論的小部件,這些小部件獨立於他們的帖子。我也認爲這種情況會讓你做出的決定變得微不足道。也就是說,如果你選擇使它們成爲一個整體,那麼請記住,在進行查詢時,一個存儲庫通常會加載整個聚合,依靠緩存等機制來提高效率。因此,您的場景將是對帖子的查詢,然後搜索該帖子的評論以查看「正確」的評論,以便編輯/刪除/不管。

+0

好點。謝謝 – 2011-02-28 02:03:42

相關問題