2010-06-23 80 views
0

我目前正在確定系統中的實體,值對象和聚合。下面要說的實體已經確定:聚合和值對象:刪除?

客戶,CustomerEmail,電子郵件,CustomerAddress,地址,地址類型

而客戶 - >電子郵件是一個多對多的關係,因爲是客戶 - >地址(含地址類型)。這些關係由CustomerAddress和CustomerEmail關係對象表示。

起初我以爲這是直截了當:

實體:客戶,CustomerEmail,CustomerAddress 值對象:電子郵件,地址,地址類型

與客戶是包含所有實體的集合的總根源和VO的上面。

我有這個問題(當我向前推進時,這可能只是因爲我正在瞭解聚合的概念)假設您有一個供應商實體使用相同的地址和電子郵件值對象來反映上述客戶聚合。在這種情況下,當客戶被刪除時,地址和電子郵件不應該被刪除,作爲供應商,甚至另一個客戶可能仍然在引用它們。我見過很多文檔,說明何時刪除聚合,聚合邊界內的所有內容都會一次全部刪除。我是否正確地認爲這不適用於價值對象的總和(即它們是不可變的......如果我們在車輛集合中有一個顏色對象爲綠色......您不會僅僅因爲一輛汽車而刪除顏色被刪除),或者電子郵件和地址是否存在自己的實體(和聚合體)作爲兩個地址,即使它們可能具有相同的屬性,也是實際的單獨身份(即一個是供應商地址,另一個是客戶地址?)如果它們確實是Value Objects,那麼如果VO只能通過它們的聚合根進行操作,那麼如何去處理它們應該被刪除的情況(沒有供應商或客戶仍然引用地址)?

乾杯,

史蒂夫

回答

2

你想在你的數據庫的千卡您的域名。這不被推薦。

供應方實體,反映了上述客戶總

這表明你缺少你的域的概念。這種「鏡像」對你的域名專家意味着什麼?如果確實存在它們之間的關係,則應該明確建模。

你說「客戶 - >電子郵件是多對多的關係」。多個客戶共享電子郵件對您的域有意義嗎?如果是的話,那麼你可能錯過了一個概念。檢查您的領域專家對此關係有何評論。如果它對於很多人來說並不是很多,但可能比電子郵件是客戶實體「擁有」的價值對象。現在,如果客戶擁有電子郵件或地址,您可以不加任何限制地將其刪除(或採取行動)。

有關DDD最難的事情之一是,你總是最終試圖在聚合之間共享實體。別。你打敗了一個Aggregate的洞穴點 - 一致性邊界。相反,在您的領域專家的幫助下找出將澄清AR之間邊界的遺漏概念。

我知道這一切聽起來很抽象(我過去曾問過這樣的問題),但事實是隻有你的領域專家可以幫助你更好地建模域。

而作爲最後的建議 - re(-re X 100)閱讀埃裏克埃文斯的書通常幫助:)