Quero implementar meu primeiro aplicativo usando o padrão CQRS junto com o Event Sourcing. Gostaria de saber como a criação de raízes agregadas deve ser tratada adequadamente. Digamos que alguém envie o comando CreateItem. Como deve ser tratado? Onde o evento ItemCreated deve ser armazenado? Como primeiro evento de um novo item? Ou devo ter algum tipo de entidade ItemList que agrega todos os itens e sua lista de eventos consiste apenas em eventos ItemCreated?
Udi Dahan sugere não criar raízes agregadas e sempre usar algum tipo de método de busca. Mas como posso buscar algo novo e certamente não tem nenhum ID atribuído. Eu entendo a idéia por trás e é bastante razoável pensar que um novo objeto é um objeto cujo estado é composto de zero eventos respondidos. Mas como devo usá-lo? Devo ter um método distinto no meu Repositório como getNewItem()
ou fazer meu get(id)
método aceitar Optional<ItemId>
?
Edit: Depois de algum tempo de escavação, achei a implementação realmente interessante dos padrões acima mencionados usando atores. O autor, em vez de criar o agregado, o recupera de algum tipo de repositório com o UUID recém-criado. A desvantagem dessa abordagem é que ele permite um estado de inconsistência temporário. Também estou querendo saber como posso implementar o delete
método com essa abordagem. Basta adicionar o evento Excluído à lista de eventos do agregado?