2017-06-21 123 views
0

我一直認爲地址數據是一個值對象,因爲它是不可變的,它的相等性由所有字段中的相同數據定義。例如,付款和收貨地址中的帳單地址是訂單或履行的一部分。當有人改變她/他的地址時,需要一個新的地址數據。但是,我遇到的每個示例代碼/應用程序都有一個地址數據作爲實體,其數據庫表具有自己的ID。如果一個系統想要跟蹤所有業務活動/事件發生的所有地址,這將是有意義的。然而,我並沒有在這些示例代碼/應用程序中看到這樣的意圖。我在這方面錯過了什麼?爲什麼地址數據是一個實體?

+0

正如在Constantin GALBENU的回答中所暗示的那樣:數據庫ID不一定表明相應的域對象是一個「實體」。它純粹便於持久性:) –

回答

1

你不能一概而論。

例子是一回事,現實世界的問題是另一回事。你不能說一個解決方案適用於所有項目。

我給你舉個例子,我在一個保存聚合根的項目中。 從邏輯上和合法的子公司是其公司的延伸,例如。沃爾瑪的總部有稅號和所有的東西以及沒有稅號的子公司。從邏輯上講,爲了向政府提供資金或類似的東西,總部向其子公司發出請求。在這裏,沃爾瑪總部是一個綜合根,其子公司是融資程序中的一部分。 這是一個合乎邏輯的例子。

我所擁有的是一家子公司可以在沒有總部知識的情況下合法申請國家資助!因此,HQ不再是一個聚合根,而是一個子公司。這是非常不合邏輯的,但這些都是業務需求。

這一點與您的價值對象問題相同。儘管您可以使用Address作爲實體或值對象的示例,但是指定地址是什麼的業務需求並不是合乎邏輯的。

+0

感謝您分享您的體驗。根據您的說法,帳單地址和送貨地址的集合根目錄分別爲付款和運費。因此,它們應該是價值對象。 – vic

1

前注:有些域的地址應該是實體,比如郵件服務;我們不談論這些域

從我的經驗來看,由於持久性,人們傾向於將地址實現爲實體:將地址作爲子實體持久存儲到關係數據庫比持久因爲在存儲表中充當主鍵的實體ID。

但是,有些策略允許將值對象存儲爲數據庫實體,但仍然將其作爲值對象使用,因爲它應該是。 Vaughn Vernon展示瞭如何在他的book,第6章,子章持續價值對象中做到這一點。

+0

謝謝。我會研究這個問題。 http://thepaulrayner.com/persisting-value-objects/ – vic