CQRS и уведомление по электронной почте

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

Конкретные шаги могли бы пойти как это:

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

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

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

6
задан Ruben Bartelink 9 August 2012 в 00:20
поделиться

1 ответ

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

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

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

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

6
ответ дан 17 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: