Скажем, у нас есть архитектура, основанная на CQRS, с такими компонентами, как Commands, Domain Model, Domain Events, Read Model DTO.
Конечно, мы можем использовать объекты Value в нашей модели домена. Мой вопрос в том, должны ли они также использоваться в:
- Команды
- События
- DTOS
Я не видел примеров, когда в упомянутых выше компонентах используются объекты Value (VO). Вместо этого используются примитивные типы. Может быть, это просто упрощенные примеры. В конце концов, мое понимание использования VO в DDD заключается в том, что они действуют как клей для всего приложения.
Моя мотивация:
команды.
Пусть пользователь отправляет форму, содержащую поля адреса. У нас есть объект Address Value для представления этой концепции. При построении команды в клиенте мы должны все равно проверять ввод пользователя, и когда он хорошо сформирован, мы можем создать объект Address прямо там и инициализировать команду с ним. Я не вижу необходимости делегировать создание объекта Address в обработчик команд.
События домена.
Модель домена уже работает с точки зрения объектов Value, поэтому, публикуя события с VO вместо их преобразования в примитивные типы, мы можем избежать некоторого кода сопоставления. Я вполне уверен, что в этом случае можно использовать VO.
DTOs.
Если наши DTO на стороне запроса могут содержать объекты Value, это обеспечивает некоторую гибкость. Например, если у нас есть объект Money, мы можем выбрать, показывать ли его в EUR или USD, не нужно изменять Read Model.