Voglio implementare la mia prima applicazione usando il modello CQRS insieme a Event Sourcing. Mi chiedo come gestire correttamente la creazione di radici aggregate. Diciamo che qualcuno invia il comando CreateItem. Come dovrebbe essere gestito? Dove deve essere archiviato l'evento ItemCreated? Come primo evento di un nuovo oggetto? O dovrei avere una sorta di entità ItemList che aggrega tutti gli elementi e il suo elenco di eventi è costituito solo da eventi ItemCreated?
Udi Dahan suggerisce di non creare radici aggregate e di utilizzare sempre una sorta di metodo di recupero. Ma come posso recuperare qualcosa di nuovo e che sicuramente non ha alcun ID assegnato. Capisco l'idea alla base ed è abbastanza ragionevole pensare che un nuovo oggetto sia un oggetto il cui stato è composto da zero eventi replicati su di esso. Ma come dovrei usarlo? Dovrei avere un metodo distinto nel mio repository come getNewItem()
o far get(id)
accettare Optional<ItemId>
invece il mio metodo ?
Modifica: dopo un po 'di scavo ho trovato l' implementazione davvero interessante dei modelli di cui sopra usando gli attori. L'autore invece di creare l'aggregato, lo recupera da una sorta di repository con l'UUID appena creato. Lo svantaggio di questo approccio è che consente uno stato di incoerenza temporanea. Mi chiedo anche come posso implementare il delete
metodo con tale approccio. È sufficiente aggiungere un evento eliminato all'elenco eventi dell'aggregato?