2009-07-14 59 views
5

從框架設計指南:應該重寫實體(在DDD中)Object.Equals?

不要落實可變引用類型的值相等。 [P-270]

從埃裏克埃文斯的DDD:

每個實體必須具有與另一對象建立其身份的操作方式。 [p-94]

我應該將覆蓋Object.Equals方法作爲標識操作還是僅比較Identity屬性(例如customer1.Id == customer2.Id)?

回答

7

您可能想要區分三種情況。

  1. 您有兩個對同一實體的引用。在這種情況下,正常的相等運算符將正確地執行其工作。無需重寫任何內容。

  2. 你在同一個實體的內存中有兩個實例。當你設計你的倉庫時,這種情況是可以避免的,但有時候這是你必須處理的情況。您的customer1.Id == customer2.Id示例在此情況下可以正常工作。

  3. 你有兩個不同的實體,但你想知道他們是否有類似的屬性值。這可能是一種代碼味道。你可能將一個值類型視爲一個實體。如果這真的是你想要做的事情,那麼你應該實現它與正常的.net ==和.Equals機制分開。 (例如。IsSameAs(客戶主題))以避免混淆。

+0

你是指「什麼時候設計你的倉庫」?你如何避免內存中多個實例的問題? – dthrasher 2009-07-27 19:46:55

0

如果您考慮重寫Object.Equals,則必須記住您也必須重寫GetHashCode()。