2011-09-20 39 views
1

我想知道什麼考慮在以下情況下更好或更正確的做法:如何使用NHibernate從聚合根的子集合中最好地選擇一個實體?

我已經制定了下列商業實體與NHibernate:

  • WallPost
  • WallPostComment

牆有零對多WallPosts。 WallPost具有零到多個WallPostComments。聚合根是Wall。

我正在寫一個任務,將WallPostComment添加到WallPost。該應用程序是一個MVC應用程序,添加新WallPostComment的請求包含該評論所屬的WallPost的ID。爲了添加評論我需要檢索它應該被添加到的帖子。我的問題是:做這件事的最好/最正確的方法是什麼?

到目前爲止,我已經嘗試了兩種方法,一種感覺更「正確」,雖然效率很低。另一種更高效的方法認爲是錯誤的。

1)我從會話中加載Wall聚合根,並從Posts集合中選擇FirstOrDefault。這感覺是'正確的',因爲我通過聚合根訪問牆貼,但這樣做會導致從數據庫中取出所有牆貼(無界結果集)。

2)我使用請求傳遞給我的wallPostId直接從會話加載牆貼。這感覺是'錯誤的',因爲我正在繞過聚合根目錄 - 但它是單行數據在數據庫上的單擊。

哪種方法更好?你還有什麼其他建議?

回答

2

真的有一面牆嗎? Wall和您的域中的其他角色之間的關係是什麼?我猜想牆與用戶連接,並且用戶有一面牆。那是對的嗎?在這種情況下,牆壁只是一個WallPosts和相關評論的集合。在這種情況下,您的WallPost是您的聚合根,並且根本沒有牆。

+0

這是一個很好的觀點。我一直認爲牆是一個實體和一個聚合根 - 但是當我讀到你的答案時,我還有另外一個'哈哈'!時刻。我將不得不更多地思考這一點,但情況可能如此。事實上,這個答案與穆罕默德的答案一樣正確 - 它只取決於域名,不是! –

2

看來WallPost本身就是一個聚合根, 這樣它有它自己的存儲庫,你可以單獨獲取它並操作它和它的註釋。並且聚合根(WallPost)可以引用另一個聚合根(Wall)時沒有問題。

如果您遇到無法修復設計以使WallPost成爲聚合根的情況,則可以利用Role InterfaceFetching Strategy的概念區分存儲庫獲取,以限制聚合根的某些方面而不是獲取它完全可以通過這種方式獲取Wall聚合根,而無需獲取所有牆貼,並獲取需要更新的牆貼。

最糟糕的情況下,當你不能做WallPost聚合根,你不想應用角色接口和/或獲取策略,你可以創建一個命令名爲CommentWallPostCommand(評論)與命令處理程序,將獲取確切需要的wallpost聚合根)並更新它,至少有明確的命令會使設計更清晰明確。

+0

謝謝!我只是有一個'aaah!'時刻 - 現在你說出來有點顯而易見!的確,WallPost可能是一個聚合根的好候選者。我會進一步探討這一點,但我認爲你是對的。我在下午2點把它歸結爲缺乏經驗和編碼的組合,我之前沒有想到這一點:-)謝謝! –

+0

好的 - 我已經很長時間思考這個問題,並決定選擇其他答案作爲我的問題的答案 - 但那只是因爲它更好地匹配我的域名。不過,我認爲這個答案同樣正確 - 它只取決於域(我決定稍微改變它)...對不起! –