Должен ли переопределять Object.Equals для сущностей (в DDD)? - PullRequest
6 голосов
/ 14 июля 2009

Из Руководства по проектированию рамок:

НЕ реализует равенство значений в изменяемых ссылочных типах. [Р-270]

Из DDD Эрика Эванса:

Каждый ЛИЦО должен иметь оперативный способ установления своей идентичности с другим объектом. [П-94]

Стоит ли рассматривать переопределенный метод Object.Equals как операцию идентификации или просто сравнивать атрибут Identity (например, customer1.Id == customer2.Id)?

Ответы [ 2 ]

7 голосов
/ 14 июля 2009

Есть три случая, которые вы, возможно, захотите различить.

  1. У вас есть две ссылки на одну и ту же сущность. В этом случае операторы нормального равенства будут выполнять свою работу правильно. Не нужно ничего переопределять.

  2. У вас есть два экземпляра в памяти одного и того же объекта. Когда вы правильно проектируете свои репозитории, такой ситуации можно избежать, но иногда вам придется работать с ней. В этом случае ваш customer1.Id == customer2.Id будет работать нормально.

  3. У вас есть две разные сущности, но вы хотите знать, имеют ли они сходные значения свойств. Это может быть кодовым запахом. Возможно, вы рассматриваете тип значения как сущность. Если это действительно то, что вы хотите сделать, вы должны реализовать это отдельно от обычных механизмов .net == и .Equals. (например .IsSameAs (тема клиента)), чтобы избежать путаницы.

1 голос
/ 14 июля 2009

Если вы рассматриваете переопределение Object.Equals, вы должны помнить, что вы также должны переопределить GetHashCode ().

...