Я создаю сервис, используя знакомый шаблон поиска событий:
- Запрос получен.
- Загружается история агрегата.
- Агрегат перестраивается (из его истории).
- Готовятся новые события, и агрегат обновляется в ответ на входящий запрос с шага 1.
- Эти события записываются в журнал и становятся доступными (публикуются) всем подписчикам.
В моем случае шаг 5 состоит из двух частей. События записываются в журнал событий. Фоновый процесс читает из журнала событий и публикует все события, начиная со смещения.
В некоторых случаях мне нужно публиковать побочные эффекты в дополнение к событиям, связанным с агрегатом. Что касается системы, то это тоже события, потому что они потребляются другими сервисами и влияют на их состояние. Однако они не влияют на историю агрегата в этой службе и не требуются для его восстановления.
Как мне обработать это в коде?
Вариант 1. Не записывать побочные события в журнал событий. Опубликуйте их в основном процессе перед Шагом 5.
Вариант 2. Записывайте все в журнал событий и игнорируйте побочные события при загрузке истории. (Это не часть истории!)
Вариант 3. Записывайте побочные события в фиктивный агрегат, чтобы они публиковались, но никогда не загружались.
Вариант 4-?
В первом варианте могут возникнуть проблемы при нарушении параллелизма. Если запись не удалась на шаге 5, побочный эффект не может быть легко отменен. Второй вариант записывает события, которые не являются частью истории агрегата. При загрузке на шаге 2 эти побочные события необходимо игнорировать. Третий вариант похож на взлом.
Что из этого кажется вам правильным?
PartnerAmountOwed.Reduced
должен вызватьPartnerCashBalance.Update()
иFunds.Distribute()
. Я бы сделал наоборот. - person guillaume31   schedule 06.01.2016PartnerAmountOwed
не должен их публиковать. Он должен не знать о побочных эффектах, которые проявляются в других агрегатах, и придерживаться своего собственного внутреннего повсеместного языка и событий. - person guillaume31   schedule 06.01.2016