Voglio implementare la mia prima applicazione utilizzando il pattern CQRS insieme a Event Sourcing. Mi chiedo come la creazione di radici aggregate debba essere gestita correttamente. Supponiamo che qualcuno invii il comando CreateItem. Come dovrebbe essere gestito? Dove deve essere memorizzato l'evento ItemCreated? Come primo evento di un nuovo oggetto? O dovrei avere qualche tipo di entità ItemList che aggrega tutti gli elementi e il suo elenco di eventi consiste solo di eventi ItemCreated?
Udi Dahan suggerisce di non creare radici aggregate e usa sempre una sorta di metodo di recupero. Ma come posso recuperare qualcosa che è nuovo e certamente non ha alcun ID assegnato. Capisco l'idea alla base ed è abbastanza ragionevole pensare che un nuovo oggetto sia un oggetto che ha il suo stato composto da zero eventi replicati su di esso. Ma come dovrei usarlo? Dovrei avere un metodo distinto nel mio repository come getNewItem()
o rendere il mio metodo get(id)
accettando Optional<ItemId>
invece?
Modifica: dopo un po 'di tempo di ricerca ho trovato implementazione interessante dei suddetti modelli usando attori. L'autore invece di creare l'aggregato, lo recupera da qualche tipo di repository con UUID appena creato. Lo svantaggio di questo approccio è che consente uno stato di incoerenza temporanea. Mi sto anche chiedendo come posso implementare il metodo delete
con tale approccio. Aggiungi semplicemente evento cancellato all'elenco degli eventi dell'aggregato?