Ho una domanda relativa a cqrs + sourcing di eventi. Ho due radici aggregate (AR1 e AR2). Quando AR1 ha ricevuto un comando / evento, verrà ricreato dal flusso di approvvigionamento dell'evento precedente dal repository (in questo caso avrà un elenco di alcuni valori x, y, z) e dopo aver aggiornato lo stato interno su (a, b, c, x, y, z) emetterà nuovi eventi (a, b, c). Questi eventi verranno recuperati da AR2 e quindi elaborati. Nel momento in cui ho bisogno di ricreare AR2 dal flusso di origine degli eventi, il livello tratteggiato all'interno di AR2 dovrebbe essere esattamente lo stesso di leyer all'interno di AR1 - quindi dovrei avere (a, b, c, x, y, z).
Un altro avviso: in AR2 questo layer sarebbe di sola lettura = necessario per fare qualche logica di business all'interno di AR2.
La domanda è: posso utilizzare gli stessi eventi generati nel livello interno AR1 per ricreare il livello tratteggiato AR2?
C'è sempre l'opzione per duplicare i dati (avere lo stesso flusso di eventi memorizzati sia nel livello AR1 che nel livello tratteggiato AR2) ma questo semplicemente sprecherà memoria. Un'altra opzione è sempre quella di inviare tutti i dati dal livello AR1 a AR2 ogni volta che accade qualche evento - in questo caso invierei anche x, y, z insieme a a, b, c.
[UPDATE] Mi è appena venuto in mente che posso modellare questo come AR2 facendo riferimento a AR1 e chiedendo AR1 ogni volta per i dati. Basta vedere come gestire questo caso poiché in CQRS l'aggregato non può restituire i dati?
Whataboutthisimplementationwithsagastylebelow?
Update: This is what I have so far - saga can be used for sending events transformed to commands from AR1 to AR2 (basically 2nd picture), but in case of instantiating new AR2 (green color in pic2 - that should not exist there actually), I do it from service layer like this:
namespace serviceLayer{
public void createAr1AndAr2(Ar1Id idar1, Ar2Id idar2){
var ar1 = getAr1FromRepo(iadr1);
var ar2 = getAr2FromRepo(idar2); //returns regularAr2 or nullObjectAr2
ar1.doSmth(ar2);
}
}
namespace domain{
class Ar1 {
List<Smht> partOfInnerState;
void doSmth(Ar2 ar2){
ar2.doSmth2(partOfInnerState);
}
}
class regularAr2 extends Ar2{
void doSmth(List<Smht> partOfInnerState){
//we need only part of partOfInnerState
}
}
class nullObjectAr2 extends Ar2{
void doSmth(List<Smht> partOfInnerState){
//we need full partOfInnerState in order to initialize this object for the first time
}
}
}