Je veux implémenter ma première application en utilisant le modèle CQRS avec Event Sourcing. Je me demande comment la création de racines agrégées doit être gérée correctement. Supposons que quelqu'un envoie la commande CreateItem. Comment cela devrait-il être géré? Où l'événement ItemCreated doit-il être stocké? Comme premier événement d'un nouvel article? Ou dois-je avoir une sorte d'entité ItemList qui regroupe tous les éléments et sa liste d'événements se compose uniquement d'événements ItemCreated?
Udi Dahan suggère de ne pas créer de racines agrégées et d'utiliser toujours à la place une sorte de méthode d'extraction. Mais comment je peux récupérer quelque chose de nouveau et qui n'a certainement aucun ID attribué. Je comprends l'idée derrière et il est assez raisonnable de penser qu'un nouvel objet est un objet qui a son état composé de zéro événements répondu sur lui. Mais comment dois-je l'utiliser? Dois-je avoir une méthode distincte dans mon référentiel comme getNewItem()
ou faire get(id)
accepter ma méthode à la Optional<ItemId>
place?
Edit: Après un certain temps de fouille, j'ai trouvé une mise en œuvre très intéressante des modèles susmentionnés en utilisant des acteurs. L'auteur au lieu de créer l'agrégat, le récupère à partir d'une sorte de référentiel avec l'UUID nouvellement créé. L'inconvénient de cette approche est qu'il permet un état d'incohérence temporaire. Je me demande également comment mettre en œuvre la delete
méthode avec une telle approche. Ajoutez simplement l'événement supprimé à la liste d'événements de l'agrégat?