2010-05-26 12 views
6

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

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

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

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

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

ответ

6

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

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

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

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

+0

Невероятно, сколько разницы может сделать одно слово. Я хотел сказать, чтобы спросить сторону READ!Я знаю об основах CQRS :) В любом случае, что вы говорите, вы бы отправились в хранилище запросов для включения данных в электронную почту? Я вижу, как это может создать проблему, так как хранилище запросов может быть несовместимым с событием UserWasInvitedToEvent. Одним из возможных решений может быть компонент/служба, которая будет слушать новые собрания, пользователя и приглашения и хранить эти данные, чтобы он мог отправлять приглашения? – t0PPy

+0

Да, это то, к чему я стремился. Есть такие вещи, как Saga в определенных системах обмена сообщениями, таких как NServiceBus, которые позволяют вам организовывать несколько обработчиков событий, которые не обязательно поступают в том же порядке каждый раз. Возможно, вы захотите изучить это. Они действуют как рабочий процесс, который позволит вам подождать всю соответствующую информацию перед выполнением некоторых действий. –

+0

Спасибо за ваш ответ - извините, что не вернулись к этому давно. Мне нравится то, что вы описываете, но я обнаружил, что предпочитаю немного другой подход: обогащение события. – t0PPy

Смежные вопросы