Пример агрегата заказа
Упрощённый учебный пример показывает поведение агрегата и хранение событий. Это не описание внедрения и не полная модель обработки заказов.
Поток заказа
Пример потока order-123 содержит OrderPlaced с версией v1, ItemAdded с v2, PaymentAuthorized с v3 и OrderShipped с v4.
Названия событий должны соответствовать реальному языку предметной области. В этом примере предполагается, что после оформления заказа можно добавлять позиции, а отгрузка требует авторизации платежа.
Построение модели чтения
Проекция списка заказов обрабатывает события и сохраняет поля для запросов, например идентификатор и статус заказа.
Другая проекция может строить список заказов, ожидающих оплаты. Обе модели выводятся из событий и не заменяют логику принятия решений в агрегате.
Изменения из интерфейса
Клиент может передавать версию заказа, показанную пользователю. Обработчик команды проверяет это предварительное условие и сохраняет события с соответствующей ожидаемой версией.
Если модель чтения ещё не обработала успешную запись, интерфейс должен сообщать о задержке, а не создавать впечатление, что команда завершилась ошибкой.
Расширение модели
Отмена, возврат средств и частичная отгрузка требуют отдельного поведения и событий. Не изменяйте прежнее событие, чтобы представить выполненную операцию как не происходившую.
Складской учёт и платежи могут относиться к другим агрегатам или ограниченным контекстам. Явно определяйте их координацию и обработку ошибок.
Практическое упражнение
Реализуйте допустимый переход состояния, отказ по инварианту и отказ записи из-за конфликта версий. Это три разных результата.
Путь обучения Event Sourcing · Назад · Далее · Документация Chronacta
