2013-05-04 54 views
2

我有以下DDD方案中,分爲以下的聚集體:DDD:一到許多在其它聚集用戶聚合根和幾乎所有實體之間的關係

用戶,
朋友(用戶協會),
文件(用戶上傳),
畫廊(文件組),
消息(用戶通信),
組(用戶可以創建和其他的會員可以加入),
GroupMessages(郵件發送到的所有成員組),
羣組論壇(羣組成員可以討論各種主題)

這就是它令人困惑的地方。用戶與GroupForums的所有內容相關聯。通過用戶存儲庫訪問其他集合似乎不合邏輯,儘管從級聯的角度來看,如果我刪除了用戶,技術上與用戶關聯的記錄也應該消失。

看起來好像我不應該將這裏存在的所有一對多關聯添加到用戶實體,因爲從數據庫中提取水合物似乎很荒謬,特別是如果我嘗試拉取與該關聯的每條記錄用戶。對於組織集合和存儲庫以及處理給定實體的許多一對多關係的正確方法,建議採用什麼策略?

回答

5

您在句子「用戶與所有內容相關聯......」中使用了「關聯」一詞這一事實是一個很有意思的事實。聚合根相關聯,或者甚至是一個'屬於'另一個,這絕對沒有問題。但是,您需要查看一個實體是否可以在沒有AR的情況下存在。如果可能的話,它可能有自己的生命週期,應該是一個AR。如果它不能它是聚合的一部分。這可能是棘手的提煉。

您需要在AR上有一個非常清晰的邊界。例如,即使論壇可能要求用戶創建它,但這並不意味着論壇需要(甚至可以)在用戶被刪除時被刪除。因此,論壇中的用戶可能變成僅包含用戶名和ID的ForumCreator(值對象)。當用戶被刪除時,論壇可以繼續存在。

在訂單/訂單行/產品方案中,如果您選擇刪除包含特定產品的所有訂單行,則沒有多大意義。我知道某個產品可能永遠不會被刪除,但我們將以此爲例。您只需將相關產品數據「非標準化」到訂單行中,例如:產品編號,產品名稱。所以即使產品名稱發生變化,並不意味着所有訂單行都需要更新,甚至應該更新。實際上,訂單行代表一個時間點,應保留「原始」產品名稱。購買者可能已經訂購了「某些lirril產品」,然後名稱變爲「小產品」。雖然它是完全相同的產品,但並不是一回事。購買者只能記住原件。

我希望這是有道理的,並以某種方式提供幫助。你一定需要找到你的對象圖上的那些硬邊以達到真正的聚合。

+0

對於用戶聚合示例,我使用了Entity Framework POCO實體生成實用程序,並創建了User對象,併爲它與其具有一對多關係的所有實體添加了IList <>屬性。順便說一句,我正在使用微軟作爲一個微型的orm。我是否應該刪除IList <>屬性條目,因爲我寧願從它們各自的存儲庫訪問它們?在這種情況下,我應該從User實體中刪除IList(一對多)關聯,並且有權訪問組通過GroupRepository而不是User存儲庫? – user1790300 2013-05-05 20:17:15

+0

我真的不知道EF,所以我不知道如何正確操作文件。對於這個問題,我不知道任何ORM :) --- w.r.t.用戶 - >組它將取決於你的域名,但我猜測用戶分組是多對多的,所以我會從用戶中刪除該列表。可能有用戶所屬的組ID的列表或包含ID和組名稱的某個值對象(UserGroup)。 – 2013-05-06 04:47:08

+0

讓我們從純粹的實體和聚合視角來看待它,組織用戶與朋友,文件,圖庫,消息,組,GroupMessages,GroupForums實體之間的關係的推薦方法是什麼?對我來說,似乎應該在用戶實體中沒有IList條目,而是每個其他實體都應該包含用戶實體的屬性。 – user1790300 2013-05-06 12:42:32