Магазин J Olivers - Saga Help - PullRequest
       6

Магазин J Olivers - Saga Help

2 голосов
/ 01 августа 2011

Я пытаюсь обернуть голову вокруг Saga, используя Jonathan Olivers EventStore и CommonDomain.Я понимаю, как Агрегаты работают с CommonDomain / EventStore, но я застрял в понимании использования Saga.Я прочитал обе саги Джонатана с Event Sourcing Part I и II, но все еще теряется в реальной реализации

1) Больше наблюдения, когда при сохранении саги EventStore использует заголовки для сохранения саги и команд, которые нуждаютсячтобы быть разосланным, и похоже, что полезная нагрузка хранит событие, которое вызвало сагу "проснуться".Интересно причины для этого.Мы бы никогда не хотели хранить отдельные команды против их всех в заголовке?

1) Кажется, что Событие, которое вызвало Saga, воспроизводится несколько раз, так как метод "Переход" в SagaBase всегда повторно добавляетсобытие к незафиксированной коллекции.(В отличие от AR, которые имеют внутренний метод Apply против метода Public Domain).Возможно, я не использую метод перехода должным образом

2) Обычно шина, которую вы используете с EventStore, будет публиковать события (я реализовал IPublishMessages).Если мне нужна моя Saga для публикации команды, то, похоже, нет опции Send.Нужно ли анализировать заголовки, чтобы получить команды самостоятельно?

Мне кажется, что я неправильно использую CommonDomain / EventStore, так как работать с Aggregates было легко, но Saga мне кажется "неполным".Я предполагаю это, потому что я не делаю это правильно.Все еще очень плохо знаком с CQRS.У кого-нибудь есть рабочий пример использования Saga J Olivers Common Domain / Event Store?Я думаю, что это значительно прояснит ситуацию.

[РЕДАКТИРОВАТЬ] Я думаю, я понял это, но хотел бы некоторый вклад.Сага действительно не должна публиковать события.Они посылают команды.Таким образом, на стороне публикации вещей для EventStore (IPublishMessages) я должен сначала проверить тип сообщения (AggregateType vs SagaType). Для AggregateTypes я могу публиковать события, но для SagaTypes публикуют только команды (находятся в заголовке).Это исключает то же событие (скажем, OrderSubmittedEvent), которое инициирует создание саги, чтобы не публиковать ее снова при сохранении саги.

1 Ответ

1 голос
/ 15 сентября 2011
  1. Команды помещаются в заголовки для отправки на шину. EventStore связан с хранением событий, поэтому события, вызвавшие саговые переходы, сохраняются. Позже, когда сага загружается из потока событий, события будут переданы методу перехода саги, чтобы привести его в текущее состояние.

  2. Метод перехода служит двойной цели в реализации саги. Переход вызывается для обработки входящих сообщений и загрузки саги от постоянства. В SagaEventStoreRepository.BuildSaga ClearUncomitedEvents и ClearUndispatchedMessages вызываются в саге после создания текущего состояния, что позволяет избежать дублирования обработки событий и команд.

  3. Я лично этого не делал, но я бы использовал отдельный экземпляр EventStore для моих саг. Это позволило бы использовать отдельную реализацию IPublishMessages для получения команд из заголовков событий и их отправки.

...