Я разрабатываю Entity Framework (сначала база данных и сначала код). Большую часть времени я использую сущности в своих моделях предметной области, сопоставленные с выделенными таблицами. В DDD есть концепция ValueObjects, которая не должна иметь идентичности и должна быть неизменной. Основываясь на вашем опыте работы с DDD, как вы используете ValueObjects? Это концепция, возникающая при создании модели (например, когда она имеет дело с данными, параметрами только для чтения ...), или есть ли какое-либо стратегическое поведение, которое ожидается или вычитается из заявления, что объект должен быть спроектирован как ValueObject (или нет), или должен быть неизменным (или нет)?
Использование ValueObjects
Ответы (2)
Есть несколько хороших примеров объектов значений на SO, проверьте это вопрос.
Равенство объектов-значений устанавливается не проверкой наличия у них одного и того же идентификатора, а путем сравнения самих значений.
Еще одна вещь, которую следует учитывать, заключается в том, что EF не поддерживает должным образом объекты значений (NHibernate).
Как рассказал Алексей с Entity Framework, у вас проблема (возможно, решена в следующей версии). Чтобы EF заполнял ваши свойства, они должны быть общедоступными и настраиваемыми. Это делает невозможным их реализацию как объекты-значения. EF следует улучшить, чтобы он мог загружать (приписанные) частные свойства или поля (например, DataContractSerializer делает это даже без использования конструктора), чтобы включить это. Чтобы приблизиться к объектам значений с помощью EF, вы можете сделать следующее:
Смоделируйте свои объекты значений как [ComplexType] в EF. Тогда они не хранятся в отдельной таблице, а поля встраиваются в любую содержащую таблицу сущностей. Это близко к семантике значения.
Для неизменности вы можете сделать свои сеттеры так, чтобы разрешать только один набор. Недостатком является то, что неизменяемость тогда применяется только во время выполнения. Другой способ - определить интерфейсы для классов, которые имеют только геттеры и используют только эти интерфейсы вне dal. Третий способ - использовать классы EF как DTO и заполнить их объектами модели предметной области (объектами истинного значения).