Можно ли вызвать сторону запроса со стороны команды, чтобы проверить, существует ли источник света по идентификатору, а затем сначала вызвать CreateLightCmd, если необходимо?
Не совсем - это приводит к гоночным условиям, последствия которых могут вас не радовать.
Обзор: DDD + CQRS + ES очень похож на архитектуру только на DDD.Основная идея заключалась в том, что мы сохраняем информацию в нашем устройстве хранения данных (он же «база данных»).Модель запускается в процессе, который загружает текущее состояние из базы данных, использует команду для вычисления нового состояния, а затем сохраняет это новое состояние в базе данных.
Тот же шаблон имеет место, когда мы выполняем поиск событий- мы читаем историю из базы данных, которую используем для записи, вычисляем новые события и добавляем эти события в историю.
Но: шаблоны создания странные .
Когда мы попытаемся запросить историю идентификатора, который мы не видели раньше, мы получим нулевое значение, или None
, или историю без событий, или что-то в этом роде.
Сюрприз в том, что это отлично .
Для вашего случая использования вы не обязательно захотите CreateLightCmd
- вместо этого вы захотите произвести новый LightCreatedEvent
когда вы получаете одну из других команд, которые должны неявно создавать источник света.
В псевдокоде:
TurnLightOn (cmd) {
history = getHistory(cmd.lightId)
if (history.isEmpty) {
history.append(LightCreatedEvent.from(cmd))
}
history.append(LightTurnedOnEvent.from(cmd))
save(cmd.lightId, history)
}