Массовое обновление агрегатов на основе изменения состояния агрегата - PullRequest
0 голосов
/ 06 июня 2018

Я работаю над приложением, основанным на событиях, в соответствии с принципами DDD и CQRS, которое позволяет размещать объявления о продаже товаров.

Есть один конкретный инвариант, который я пытаюсь смоделировать, который, как представляется, включаетмассовое обновление AR, и я не знаю, как это сделать.

Инвариант таков:

  • Участник может опубликовать объявление
  • Участник может быть заблокирован администратором
  • Если участник заблокирован, его объявления должны быть приостановлены

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

Я спроектировал свои совокупные корни так:

  • Участник
  • Объявление
  • Заказ

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

Когда объявления публикуются, они, конечно, вставляются в прочитанную модель.

Теперь, когда участник забанен, происходит событие, связанное с тем, что член AR запускается.MemberWasBanned (MemberId)

Мой вопрос: как мне найти все объявления, которыми владеет участник, и приостановить их?

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

Таким образом, мой лучший подход после долгих размышлений - создать длительный процесс, в котором я создаю обработчик для MemberWasBanned, а затем иду искать его активные объявления в прочитанноммодели и выполните команды, чтобы приостановить их одну за другой.

Я что-то упустил?Я думал об использовании диспетчера процессов, но читал, что вы не должны обращаться к стороне чтения из PM.В любом случае, PM в большинстве случаев определяет команду, отправленную в ОДИН АР.

Я что-то упустил?

1 Ответ

0 голосов
/ 07 июня 2018

Если у вас есть механизм обмена сообщениями, возможно, вы можете «взорвать» событие MemberWasBanned .

Опубликуйте событие MemberWasBanned (или его эквивалент) через конвейер обмена сообщениями и подпишитесь на него из контекста, который обрабатывает рекламу.Когда это событие получено в вашем механизме обмена сообщениями, вы можете разбить его на несколько DisableAd событий, которые также будут отправлены через вашу систему обмена сообщениями, каждое из которых нацелено на одно текущее объявление забаненного участника.

Тогда каждое из этих событий будет записываться только в одном Агрегате (каждое объявление отключает его), когда они обрабатываются механизмом обмена сообщениями.

Одновременно заблокированный пользователь будет запрещатьдополнительные объявления не будут добавлены, так что вы будете в безопасности и с этой стороны.

...