События домена, которые запускают другие изменения домена в CQRS

Во всех примерах CQRS, которые я видел, события домена запускают обновления модели чтения, но ничего больше. Но как насчет того, чтобы событие домена вызывало другие изменения в домене?

Например, предположим, что у вас есть следующие требования:

  • при нажатии кнопки «закрыть аккаунт» закрыть аккаунт
  • когда счет будет погашен, закрыть счет
  • когда учетная запись закрыта, отметьте владельца учетной записи как "особого"

Как лучше всего с этим справиться?

  1. Заставьте Account.Close () создать событие AccountClosed и также пометить владельца как "особый"
  2. Сделайте обработчик AccountClosed, который помечает владельца как "особый"
  3. Создайте обработчик AccountClosed, который отправит команду MarkOwnerAsSpecial
  4. Сделайте так, чтобы обработчики команд, закрывающие учетную запись, также помечали владельца учетной записи как «особого».

person Trystan Spangler    schedule 06.01.2012    source источник


Ответы (1)


Именно для этой цели существует особая концепция под названием Саги. Начните с статьи Рината Абдуллина, а потом продолжайте.

https://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-i-of-ii/

Ваш вариант 3 близок к этой концепции. Сага - это, по сути, обработчик событий, который выдает новые команды. Вы бы не хотели, чтобы событие управляло агрегатами за пределами того, из которого оно исходит, а лучше обрабатывать событие и отправлять новые команды в соответствии с вашими бизнес-правилами. Это то, что будет делать сага.

person Dennis Traub    schedule 06.01.2012
comment
Я читал это раньше, но это было настолько абстрактно, что я не понимал, как саги в основном превращают события в команды. Я нашел еще одну статью из двух частей, в которой это объясняется и есть образцы кода. blog.jonathanoliver.com / 2010/09 / - person Trystan Spangler; 09.01.2012
comment
@TrystanSpangler Эта ссылка дает 404 и, похоже, была перемещена на blog.jonathanoliver.com/ - person Melle; 27.11.2017