Команда CQRS для обработки, а не для обновления агрегата - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть проект, разработанный с использованием принципов проектирования, управляемых доменом.Он основан на CQRS с использованием аксонов.У меня есть сценарий, где мне нужно, где по конкретной команде мне нужно создать документ в агрегате, используя состояние агрегата.Мне не нужно хранить идентификатор сгенерированного документа в совокупности.Но мне нужно опубликовать событие из агрегата с идентификатором сгенерированного документа, потому что другой домен нуждается в этом идентификаторе.

Рекомендуется ли запускать команду не для обновления агрегатного состояния, а для некоторой обработкии публикация события для обновления другого агрегата?

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

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

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

Конечно, вы можете публиковать события домена не для источников.На самом деле, вы можете сделать CQRS без ES.События - это способ асинхронной связи между BC.

0 голосов
/ 18 декабря 2018

То есть, вы хотите использовать AR как фабрику для другого AR (Document в данном случае)?На самом деле это довольно часто и помогает быть верным вездесущему языку, а не порождать AR из ниоткуда.

Я не уверен, как работают обработчики команд AXON и как сохраняется состояние после этого, но вот как бы ясделайте это:

//Handler
Document doc = someAggregate.generateDocument(id, ...);
documentRepository.save(doc);

Если вам действительно не нужна Document AR, вы можете просто создать событие напрямую:

DocumentGenerated event = someAggregate.generateDocument(id, ...);
eventStore.append(event); 

Затем можно отправить событие DocumentGeneratedв другой контекст, используя любую имеющуюся инфраструктуру обмена сообщениями.

...