2012-01-06 6 views
8

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

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

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

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

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

ответ

9

Там в определенный с oncept называется Sagas для этой цели. Начните с этой статьи Рината Абдуллина, затем оттуда.

http://abdullin.squarespace.com/journal/2010/9/26/theory-of-cqrs-command-handlers-sagas-ars-and-event-subscrip.html

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

+0

Я читал это раньше, но это было настолько абстрактно, что я не понял, как саги в основном превращают события в команды. Я нашел еще 2 статьи, которые объясняют это и имеют образцы кода. http://blog.jonathanoliver.com/2010/09/cqrs-sagas-with-event-sourcing-part-i-of-ii/ –

+0

@TrystanSpangler Эта ссылка дает 404 и, похоже, была перенесена на http://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-i-of-ii/ – Melle