应该重写实体(在DDD中)Object.Equals?

问题描述:

从框架设计指南:应该重写实体(在DDD中)Object.Equals?

不要落实可变引用类型的值相等。 [P-270]

从埃里克埃文斯的DDD:

每个实体必须具有与另一对象建立其身份的操作方式。 [p-94]

我应该将覆盖Object.Equals方法作为标识操作还是仅比较Identity属性(例如customer1.Id == customer2.Id)?

您可能想要区分三种情况。

  1. 您有两个对同一实体的引用。在这种情况下,正常的相等运算符将正确地执行其工作。无需重写任何内容。

  2. 你在同一个实体的内存中有两个实例。当你设计你的仓库时,这种情况是可以避免的,但有时候这是你必须处理的情况。您的customer1.Id == customer2.Id示例在此情况下可以正常工作。

  3. 你有两个不同的实体,但你想知道他们是否有类似的属性值。这可能是一种代码味道。你可能将一个值类型视为一个实体。如果这真的是你想要做的事情,那么你应该实现它与正常的.net ==和.Equals机制分开。 (例如。IsSameAs(客户主题))以避免混淆。

+0

你是指“什么时候设计你的仓库”?你如何避免内存中多个实例的问题? – dthrasher 2009-07-27 19:46:55

如果您考虑重写Object.Equals,则必须记住您也必须重写GetHashCode()。