Это очень хороший вопрос, и я тщательно обдумывал, встраивать объекты значений в команды или нет.Я пришел к выводу, что вам определенно не следует использовать объекты Value в командах:
Команды являются частью прикладного уровня, они должны работать как можно проще, избегая любых типизированных объектов, и лучше всего работать с использованием литерала (думаю сериализация).Что происходит, когда внешняя система хочет подключиться к вашему шестиугольнику (прикладному уровню) и отправить команды в ваше приложение, нужна ли им ваша библиотека команд, чтобы иметь возможность использовать объекты и определенную структуру?Конечно нет !Вы не хотите этого, поэтому сохраняйте команду простой.
Другая причина, по словам Дмитрия Бодю, VO содержит бизнес-логику и проверку, они принадлежат слою домена, никогда не помещают их в команды.Служба приложений выполнит перевод и будет отвечать за выдачу ошибки проверки любым несоответствующим командам на клиенте.
В вашем дизайне нет ничего плохого, на самом деле это как Вон Вернон (автор книги «Реализация доменного управления»)- Книга IDDD) сделал в своем хранилище, вы можете проверить прикладной уровень по этой ссылке:
https://github.com/VaughnVernon/IDDD_Samples/blob/master/iddd_identityaccess/src/main/java/com/saasovation/identityaccess/application/IdentityApplicationService.java
Обратите внимание, как он восстанавливает каждый объект из плоских команд, чтобы оценить объект, принадлежащийслой домена:
@Transactional
public void changeUserContactInformation(ChangeContactInfoCommand aCommand) {
User user = this.existingUser(aCommand.getTenantId(), aCommand.getUsername());
this.internalChangeUserContactInformation(
user,
new ContactInformation(
new EmailAddress(aCommand.getEmailAddress()),
new PostalAddress(
aCommand.getAddressStreetAddress(),
aCommand.getAddressCity(),
aCommand.getAddressStateProvince(),
aCommand.getAddressPostalCode(),
aCommand.getAddressCountryCode()),
new Telephone(aCommand.getPrimaryTelephone()),
new Telephone(aCommand.getSecondaryTelephone())));
}
Команды не должны содержать бизнес-логику, поэтому они не могут содержать объект значения.