2013-11-22 71 views
1

我在下面的案例中遇到了一個關於識別值對象的問題,以及我如何實現這一點。域驅動設計 - 值對象或實體

的情況:

在網絡社區的用戶可以有自己的私人/公共網頁(類似於Facebook的爲例)。在此頁面中,他們可以發佈帖子等。這些帖子可以被其他用戶評分。不僅可以對帖子進行評分,而且整個頁面也可以由其他用戶評分。

因此,如果我嘗試對這個模型進行建模,我最終會得到3個實體(Page,User,Post),這些實體在這個內容中都有唯一的標識。 但是收視率呢?我傾向於一個價值對象,因爲評級在這個內容中沒有足夠的身份(一個帖子或頁面可以不存在),並且沒有用戶就不能存在。

的問題:這是一個值對象或者是一個實體:)

謝謝!

回答

0

鑑於對問題的描述,Rating是一個值對象。

價值對象確實是領域專家和用戶可以用來描述實體的質量但未被識別的東西。

評級可以通過shared identifiers持有對用戶實體的引用,Post類可以有類似void Register(Rating rating)的命令。

+0

感謝您的快速回復! 但是,在值對象中聲明一個引用不是一種不好的做法嗎?當然是它的主人?這是我感到困擾的問題;) – cocheese

2

在我看來,您的評分系統是高度併發的,因爲您期望來自許多併發用戶的單個AR的評分。如果兩個併發評級進來,這肯定會導致陳舊的AR的大問題。您可以更好地將您的評級設置爲自己的AR,以允許同時創建單個Post/Page的評級,例如參見Vaughn Vernon的IDDD書籍,其中他談論併發用戶。

+0

嗯,好的洞察力,但你說評級是一個實體? 對於AR,你是指Aggregate Root的權利? – cocheese

+0

是的,我建議將它建模爲一個實體,然後(AR = Aggregate Root)。其他聚合根(頁面,帖子)可以異步更新,例如全部5分鐘(最終一致性)。 –

0

當您嘗試使對象成爲值對象時,請不要僅考慮其身份。值對象應該是不可變的,並且在應用程序中不會太多,例如品牌。世界上的所有品牌都不超過系統的用戶或頁面。或金錢和地址 因爲並非每個對象都有自己的身份,所以價值對象用於降低複雜性,而不是通過雙向選擇一個對象作爲實體或價值對象來使現有問題更復雜! 你的情況:頁面,用戶和帖子可能是一個聚合的實體或者可能是聚合根(根據你的應用),但系統的速率可能是實體或值對象。如果它沒有標識讓您通過聚合根檢索它,則將其指定爲值對象,但在其他情況下,它可能是聚合的實體。 看看這篇關於DDD的短篇博文: http://www.ehsanghanbari.com/Post/15/domain-driven-design-alphabet