Абстрактный базовый класс для всех объектов домена - PullRequest
5 голосов
/ 15 марта 2009

В некоторых моделях объектов домена я вижу, что создается абстрактный базовый класс (который реализует Equals и GetHashCode) для всех объектов Entity домена, от которых он наследует, чтобы получить свою идентичность.

Мне не ясно, зачем нужен этот базовый класс и когда и почему его следует использовать. Можете ли вы дать мне некоторое представление об этом или направить мне ссылку, которая говорит об этом

Спасибо

Теперь я понимаю преимущества переопределения равенства (эта ссылка помогла http://en.csharp -online.net / CSharp_Canonical_Forms —Identity_Equality)

Возвращаясь к доменно-ориентированному дизайну, я бы хотел немного расширить свой вопрос;

У меня есть клиентский объект, который я использую в качестве идентификатора guid.

Если я создаю 2 экземпляра клиента с одинаковыми данными, поскольку в качестве идентификатора я использую guid, это будут два разных объекта. Но так как они имеют все атрибуты одинаковые, они должны быть одним и тем же объектом (или лучше использовать DDD, чтобы сохранить их уникальными и отдельными?)

Попытка понять, должен ли я обрабатывать равенство двух объектов по их полному совпадению значений атрибутов. Если я иду в этом направлении, то я смотрю либо на переопределение равенства базового класса на уровне подкласса, и реализую эти условия, либо на идентичности объекта представляем строку или хэш-код (?), Представляющий значения всех эти атрибуты и используют равенство базового класса.

Я мог бы быть немного отсюда, так что заранее спасибо за терпение.

Ответы [ 5 ]

3 голосов
/ 16 марта 2009

Использование термина равенство здесь перегружено:

1) Равенство для Идентичность

Если у вас есть 2 экземпляра одного и того же клиента, они оба должны иметь одинаковое значение GUID - это единственный способ убедиться, что вы работаете с одним и тем же объектом. В действительности, всегда будут разные экземпляры одного и того же объекта (например, многопользовательские приложения, работающие на разных компьютерах).

2) Равенство для одинаковости

Здесь вы проверяете, что 2 экземпляра имеют одинаковые значения. Например, если 2 сотрудника смотрят на одного и того же Клиента, а первое лицо изменяет и сохраняет его, оба будут видеть разные данные. Они оба заинтересованы в одном и том же клиенте, но данные устаревают.

Для (2) вам определенно нужен механизм для проверки. Вы можете сравнить каждое свойство (дорогое) или использовать свойство «версия» для обнаружения изменений (см. Механизм оптимистической блокировки NHibernate ).

Я думаю, что ваш пример немного надуманный и может отвлечь вас от более важных аспектов DDD. Если вам интересно, Я продаю инструмент , который поможет легче понять концепции DDD.

1 голос
/ 08 ноября 2014

Вы должны сравнить идентификаторы объектов, если они являются сущностями, и их атрибуты, если они являются объектами значения. Это означает, что вам не нужно наследовать ваши объекты-значения от базовой сущности, но для сущностей лучше создать ее.

Как понять, является ли класс сущностью или объектом значения? Вам следует ответить на вопрос: равны ли объекты такого класса, если они имеют одинаковый набор атрибутов? Если да, они являются объектами значений. Например, два человека не равны, даже если у них одинаковые имена и даты рождения - вы все равно должны рассматривать их как разные объекты. Но если у вас есть монета 25 центов, вам, возможно, все равно, какой у вас точный кусок металла, все они всего лишь монеты 25 центов.

Есть отличная статья, описывающая детали: базовый класс объекта домена

1 голос
/ 24 марта 2009

Если вы следуете DDD, я считаю, что вам следует проверить равенство объектов по их идентификатору (Identity). Это связано с тем, что сущности домена в основном определяются и отслеживаются по его идентификатору, а не по атрибутам. Поэтому независимо от того, насколько они похожи на другие объекты, они все еще являются различными объектами.

Другая концепция, которую вы хотели бы проверить, - это объект-значение. Это то, что описывает характеристики объекта и не требует идентичности. Например, адрес, деньги, цвет.

0 голосов
/ 24 марта 2009

Я бы проверил на идентичность только проверку идентичности, потому что она позволяет вам иметь экземпляр сущности, содержащей ситуацию до и после, что иногда может быть очень удобно. Чтобы проверить, изменился ли экземпляр, можно использовать флаг Dirty.

НТН, Jonathan

0 голосов
/ 15 марта 2009

Вы указали на две причины, по которым он используется.

Для «Равных» вы можете не всегда проверять, является ли фактическая ссылка равной, потому что это может быть не так. Возможно, вы захотите использовать какое-то идентифицирующее свойство (например, public int ID), чтобы проверить, равны ли 2 сущности. Базовая реализация Equals просто собирается проверить, равны ли две ссылки.

Что касается хеш-кода, это способ уникальной идентификации данного объекта / типа при использовании его в хеш-алгоритмах и т. Д.

...