Quiero implementar mi primera aplicación usando el patrón CQRS junto con Event Sourcing. Me pregunto cómo se debe manejar adecuadamente la creación de raíces agregadas. Digamos que alguien envía el comando CreateItem. ¿Cómo se debe manejar? ¿Dónde debe almacenarse el evento ItemCreated? ¿Como primer evento de un nuevo artículo? ¿O debería tener algún tipo de entidad ItemList que agregue todos los elementos y su lista de eventos consista solo en eventos ItemCreated?
Udi Dahan sugiere no crear raíces agregadas y usar siempre algún tipo de método de recuperación. Pero cómo puedo obtener algo que es nuevo y ciertamente no tiene ninguna identificación asignada. Entiendo la idea detrás y es bastante razonable pensar que un nuevo objeto es un objeto que tiene su estado compuesto de cero eventos respondidos. ¿Pero cómo debo usarlo? ¿Debería tener un método distinto en mi repositorio getNewItem()
o hacer que mi get(id)
método acepte en su Optional<ItemId>
lugar?
Editar: Después de un tiempo de excavación, encontré una implementación realmente interesante de los patrones antes mencionados utilizando actores. El autor, en lugar de crear el agregado, lo recupera de algún tipo de repositorio con UUID recién creado. El inconveniente de este enfoque es que permite un estado de inconsistencia temporal. También me pregunto cómo puedo implementar el delete
método con ese enfoque. ¿Simplemente agregue Evento eliminado a la lista de eventos del agregado?