Возьмем простой пример "Регистрация учетной записи", вот поток:
- Веб-сайт посетителя
- Нажмите кнопку "Зарегистрироваться" и заполните форму, нажмите кнопку "Сохранить"
- MVC-контроллер: проверьте уникальность уникального имени пользователя, прочитав ReadModel
- RegisterCommand: снова подтвердить уникальность имени пользователя (вот вопрос)
Конечно, мы можем проверить уникальность UserName, прочитав ReadModel в MVC-контроллере, чтобы повысить производительность и пользовательский интерфейс. Тем не менее, нам все равно нужно снова проверить уникальность в RegisterCommand, и, очевидно, мы НЕ должны получать доступ к ReadModel в командах.
Если мы не используем Event Sourcing, мы можем запросить модель домена, чтобы не было проблем. Но если мы используем Event Sourcing, мы не можем запросить модель домена, так как мы можем проверить уникальность UserName в RegisterCommand?
Примечание. Класс пользователя имеет свойство Id, а UserName не является ключевым свойством класса User. Мы можем получить объект домена только с помощью идентификатора при использовании источника событий.
BTW: В требовании, если введенное UserName уже принято, веб-сайт должен показать сообщение об ошибке "К сожалению, имя пользователя XXX недоступно" посетителю. Неприемлемо показывать сообщение, скажем: "Мы создаем вашу учетную запись, пожалуйста, подождите, мы отправим вам результат регистрации по электронной почте позже", посетителю.
Есть идеи? Большое спасибо!
[ОБНОВИТЬ]
Более сложный пример:
Требование:
При размещении заказа система должна проверять историю заказа клиента, если он является ценным клиентом (если клиент разместил по меньшей мере 10 заказов в месяц в прошлом году, он ценен), мы делаем 10% скидку на заказ.
Реализация:
Мы создаем PlaceOrderCommand, и в команде нам нужно запросить историю заказов, чтобы узнать, является ли клиент ценным. Но как мы можем это сделать? Мы не должны получать доступ к ReadModel в команде! Как сказал Микаэль, мы можем использовать компенсирующие команды в примере регистрации учетной записи, но если мы также будем использовать это в этом примере заказа, это будет слишком сложно, и код может быть слишком сложным в обслуживании.