Я строю прототип для изучения CQRS и источников событий.Поддержание совпадающих корневых ссылок в CQRS. Sagas vs обработчики команд
Скажет, у меня есть 2 корневых заполнители, Организация и Амплуа, один ко многим отношений с необходимостью ссылки на два пути. Позиции могут существовать без организаций (например, фрилансеров).
Для этого обсуждения можно предположить, что были созданы объекты Organization и Position. Теперь у меня есть команда AddPositionToOrganisation
.
Убедитесь, что ссылки находятся в синхронизации. Я вижу, у меня есть два варианта.
- Обработчик команды Organization может генерировать два события. Один для Организации и один для позиции, добавляющий соответствующие ссылки.
- Создайте сагу, которая прослушивает событие
PositionAddedOrganisation
и создаст файлAddOrganisationToPositionCommand
.
Есть ли проблема с использованием обработчика команды Organization для создания событий для позиции? С положительной стороны он группирует связанную функциональность вместе (ссылки), но заставляет Организацию отвечать за некоторую логику позиции.
Некоторое понимание более опытных разработчиков было бы очень желанным.
Нет, я не думаю, что в принципе есть проблема с опцией 1. Для меня всегда своя совокупность, которая должна испускать событие, но если обработчик команды хочет вызвать два агрегата в область действия и выполнить действие на каждый из них принимает эти два события и публикует их вместе в рамках одной транзакции с базой данных, это должно быть хорошо. Я все еще изучаю, как должны быть реализованы системы, основанные на событиях, поэтому я уверен, что кто-то меня исправит! –
Спасибо за ответ. По моему пониманию команды могут ориентироваться только на один агрегат. Обработчики команд проверяют эту команду и создают результирующие события. Агрегаты применяют эти события до их передачи в остальную часть системы. Поэтому мой текущий проект имеет агрегаты, которые также действуют как обработчики команд. Вариант 1 будет иметь организацию, создающую события для позиции (немного вонючие), но она держит логику вместе, а не распространяет ее на 2 обработчика команд. – Magpie
ОК, я никогда не видел, чтобы это говорило раньше, что один обработчик команд должен ориентироваться только на один агрегат.На мой взгляд, обработчик команд обычно вызывает вызовы в один агрегат, что приводит только к составлению списка локальных событий, эти события сохраняются в хранилище. Каким будет вред при применении операций ко второму агрегату, а затем сохранение его событий? –