应该覆盖实体的Object.Equals(在DDD中)?

Soe*_*Moe 6 .net domain-driven-design

从框架设计指南:

不要在可变引用类型上实现值相等.[P-270]

来自Eric Evans的DDD:

每个ENTITY必须具有与另一个对象建立其身份的操作方式.[P-94]

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

Men*_*elt 7

您可能希望能够区分三种情况.

  1. 您有两个对同一实体的引用.在这种情况下,正常的相等运算符将正确地完成其工作.无需覆盖任何东西.

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

  3. 您有两个不同的实体,但您想知道它们是否具有相似的属性值.这可能是代码味道.您可能将值类型视为实体.如果您真的想要这样做,那么您应该从正常的.net ==和.Equals机制中单独实现它.(例如.IsSameAs(客户主题))以避免混淆.