Использование ValueObjects

Я разрабатываю Entity Framework (сначала база данных и сначала код). Большую часть времени я использую сущности в своих моделях предметной области, сопоставленные с выделенными таблицами. В DDD есть концепция ValueObjects, которая не должна иметь идентичности и должна быть неизменной. Основываясь на вашем опыте работы с DDD, как вы используете ValueObjects? Это концепция, возникающая при создании модели (например, когда она имеет дело с данными, параметрами только для чтения ...), или есть ли какое-либо стратегическое поведение, которое ожидается или вычитается из заявления, что объект должен быть спроектирован как ValueObject (или нет), или должен быть неизменным (или нет)?


person Rénald    schedule 29.04.2015    source источник
comment
Объекты значений очень полезны в DDD. Вот исчерпывающий пример. Однако я не думаю, что этот шаблон совместим с Entity Framework. В любом случае доменные модели должны быть агностическими, поэтому, если Entity Framework мешает вам правильно моделировать вещи, вам придется выбрать: DDD или EF. У вас не может быть и того, и другого.   -  person Mark Seemann    schedule 06.05.2015


Ответы (2)


Есть несколько хороших примеров объектов значений на SO, проверьте это вопрос.

Равенство объектов-значений устанавливается не проверкой наличия у них одного и того же идентификатора, а путем сравнения самих значений.

Еще одна вещь, которую следует учитывать, заключается в том, что EF не поддерживает должным образом объекты значений (NHibernate).

person Alexey Zimarev    schedule 29.04.2015

Как рассказал Алексей с Entity Framework, у вас проблема (возможно, решена в следующей версии). Чтобы EF заполнял ваши свойства, они должны быть общедоступными и настраиваемыми. Это делает невозможным их реализацию как объекты-значения. EF следует улучшить, чтобы он мог загружать (приписанные) частные свойства или поля (например, DataContractSerializer делает это даже без использования конструктора), чтобы включить это. Чтобы приблизиться к объектам значений с помощью EF, вы можете сделать следующее:

Смоделируйте свои объекты значений как [ComplexType] в EF. Тогда они не хранятся в отдельной таблице, а поля встраиваются в любую содержащую таблицу сущностей. Это близко к семантике значения.

Для неизменности вы можете сделать свои сеттеры так, чтобы разрешать только один набор. Недостатком является то, что неизменяемость тогда применяется только во время выполнения. Другой способ - определить интерфейсы для классов, которые имеют только геттеры и используют только эти интерфейсы вне dal. Третий способ - использовать классы EF как DTO и заполнить их объектами модели предметной области (объектами истинного значения).

person Holger Thiemann    schedule 06.05.2015