Доменные события, которые вызывают другие изменения домена в CQRS - PullRequest
8 голосов
/ 07 января 2012

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

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

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

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

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

1 Ответ

9 голосов
/ 07 января 2012

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

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

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

...