В книге Vaughn Vernon's Implementing Domain-Driven Design
он описал использование заводского метода в сводном корне. Примером может служить совокупный корень Forum
, который имеет фабричный метод startDiscussion
, который возвращает корень агрегата Discussion
.Может ли метод агрегатной корневой фабрики возвращать команду вместо публикации события?
Как реализовать этот заводской шаблон в системе поиска событий, особенно в Axon?
Я считаю, что обычно, он может быть реализован следующим образом:
StartDiscussionCommand
->DiscussionStartedEvent
->CreateDiscussionCommand
->DiscussionCreatedEvent
Мы огнь StartDiscussionCommand
быть обрабатываемым Forum
, Forum
затем публикует a DiscussionStartedEvent
. Внешний обработчик событий поймал бы DiscussionStartedEvent
, преобразует его и запускает CreateDiscussionCommand
. Другой обработчик будет создавать экземпляр Discussion
, используя CreateDiscussionCommand
, а Discussion
будет стрелять DiscussionCreatedEvent
.
Альтернативно, мы можем вместо этого: StartDiscussionCommand
->CreateDiscussionCommand
->DiscussionCreatedEvent
Мы огонь StartDiscussionCommand
, который бы вызвать обработчик команд и вызывать Forum
«s startDiscussion() метод, который будет возвращать CreateDiscussionCommand
. Затем обработчик отправит этот CreateDiscussionCommand
. Другой обработчик получает команду и использует ее для создания экземпляра Discussion
. Discussion
затем запустит DiscussionCreatedEvent
.
Первая практика включает в себя 4 DTO, в то время как вторая включает только 3 DTO.
Любые мысли о том, какая практика должна быть предпочтительной? Или есть другой способ сделать это?
'DiscussionCreatedCommand' is' DiscussionCreatedEvent' –
@ConstantinGALBENU Спасибо, что указал на клерикальную ошибку. Я исправил это. – sofiaguyang
Я бы выбрал первое решение, но без 'CreateDiscussionCommand' и' DiscussionCreatedEvent'. Вам это действительно нужно? Я считаю, что 'DiscussionStartedEvent' может быть достаточно –