CQRS и уведомление по электронной почте - PullRequest
6 голосов
/ 26 мая 2010

Читая о CQRS, много говорят об уведомлении по электронной почте - мне интересно, откуда взять данные. Представьте себе сенарио, где один пользователь приглашает других пользователей на мероприятие. Чтобы сообщить пользователю, что он был приглашен на событие, ему отправляется электронное письмо.

Конкретные шаги могут выглядеть следующим образом:

  1. Команда CreateEvent со связанной коллекцией приглашаемых пользователей получена сервером.
  2. Создается новый агрегат Meeting, и для каждого приглашаемого пользователя вызывается метод InviteUser.
  3. Каждый раз, когда пользователь приглашается на событие, возникает событие домена UserWasInvitedToEvent.
  4. Отправитель уведомления по электронной почте принимает событие домена и отправляет уведомление по электронной почте.

Теперь у меня такой вопрос: куда мне обратиться за информацией для включения в электронное письмо?

Скажите, я хочу включить описание события, а также имя пользователя. Поскольку это CQRS, я не могу получить его через модель моего домена; Все свойства доменных объектов являются частными! Должен ли я тогда запросить сторону чтения? Или, может быть, полностью переместить уведомление по электронной почте на другой сервис?

1 Ответ

6 голосов
/ 27 мая 2010

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

  1. Домен должен зарегистрироваться и отправить EventCreated событие для обработчиков / обработчиков событий.Это может быть вызвано из конструктора агрегата Meeting.
  2. Компонент обработки события может получить событие EventCreated и обновить базу данных запросов данными, содержащимися в событии (т. Е. Idсобытия и его имени).
  3. Домен может зарегистрироваться и отправить событие UserWasInvitedToEvent обработчикам событий.
  4. Обработчики событий получат UserWasInvitedToEvent и обновят запросхранить с любыми необходимыми отчетными данными.
  5. Другой компонент обработки событий также может получить событие UserWasInvitedToEvent.Этот процесс может иметь доступ к базе данных запросов и извлекать все данные, необходимые для отправки электронной почты.

База данных запросов - это не что иное, как база данных отчетов, поэтому вы даже можете иметь конкретную таблицукоторый хранит все данные, необходимые для электронной почты, в одном месте.

Чтобы организовать несколько разных событий в одном обработчике (при условии, что события могут обрабатываться в разном порядке в разное время), вы можете использоватьконцепция Saga в вашей шине обмена сообщениями.NServiceBus является примером шины обмена сообщениями, которая поддерживает Saga's .См. Также этот вопрос StackOverflow: NServiceBus Отложенная обработка сообщений .

...