Comment créer de nouvelles racines agrégées dans l'architecture CQRS? Dans cet exemple, je veux créer une nouvelle racine agrégée AR2 qui contient une référence à la première AR1.
Je crée AR2 en utilisant la méthode AR1 comme point de départ. Jusqu'à présent, je vois peu d'options:
- Dans la méthode AR1,
createAr2RootOpt1
je pourrais appelernew AR2()
et enregistrer cet objet dans db immédiatement en utilisant le service de domaine qui a accès au référentiel. Je pourrais émettre un événement dans la première racine agrégée, par exemple.
SholdCreateAR2Event
puis avoir une saga sans état qui réagit à ce sujet et émet une commandeCreateAR2Command
qui est ensuite gérée et crée réellement AR2 et émetAR2CreatedEvent
. En cas d'utilisation, le sourcing d'événementsSholdCreateAR2Event
ne serait pas conservé dans le magasin d'événements, car il n'affecte pas l'état de la première racine agrégée. (Ou devrions-nous toujours l'enregistrer dans le magasin d'événements?)class AR1{ Integer id; DomainService ds; //OPTION 1 void createAr2RootOpt1(){ AR2 ar2 = new AR2(); ds.saveToRepo(ar2); } //OPTION 2 void createAr2RootOpt2(){ publishEvent(new SholdCreateAR2Event()); //we don't need this event. Shoud it still be preserved in event store? } } class AR2{ Integer id; Integer ar1Id; void handle(CreateAR2Command command){ //init this AR with values and save publishEvent(AR2CreatedEvent()); //used for projections afterwards and saved inside AR2 event store } } class Saga{ void handle(SholdCreateAR2Event ev){ emitCommand(new CreateAR2Command()); } }
Quelle est la meilleure façon de procéder?
AR1WasCreated
? Devrait-il en être ainsiAR2WasCreated
? De plus, si j'utilise votre logique, j'émets un événementAR2WasCreated
avant qu'il ne soit réellement créé? Et l'enregistrement de cet événement dans le journal des événements d'AR1 semble problématique, car je n'ai pas réellement besoin de ces données dans AR1 (cela ne modifie rien dans AR1).