Hay una cosa sobre CQRS que no entiendo: Cómo actualizar el modelo de lectura cuando el evento planteado no contiene los detalles necesarios para actualizar el modelo de lectura.Los eventos CQRS no contienen los detalles necesarios para actualizar el modelo de lectura
Lamentablemente, este es un escenario bastante común.
Ejemplo: agrego un usuario a un grupo, entonces envío un comando addUserToGroup (userId, groupId). Esto se recibe, manejado por el manejador de comandos, el evento userAddedToGroup se crea, almacena y publica.
Ahora, un controlador de eventos recibe este evento y las dos ID. Ahora habrá una vista que enumere todos los usuarios con los nombres de los grupos en los que se encuentran. Para actualizar el modelo de lectura para esa vista, necesitamos la identificación del usuario (que tenemos) y el nombre del grupo (que no usamos). t have, solo tenemos su id).
Entonces la pregunta es: ¿Cómo manejo este escenario?
En la actualidad, cuatro opciones vienen a la mente, todos con sus desventajas específicas:
El modelo de lectura pide el dominio. => Prohibido, y ni siquiera es posible, ya que el dominio solo tiene comportamiento, no estado (público).
El modelo de lectura lee el nombre del grupo de otra tabla en el modelo de lectura. => Funciona, pero ¿qué pasa si no hay una tabla que coincida?
Agregue los datos necesarios para el evento. => No funciona, ya que esto significa que también tuve que actualizar todos los eventos anteriores, y no puedo prever qué datos necesitaré algún día.
No maneje el evento mediante un controlador de eventos "habitual", pero inicie un proceso ETL en segundo plano que trate con el almacén de eventos, cree los datos necesarios y escriba el modelo de lectura. => Funciona, pero para mí esto parece un poco excesivo para un escenario tan simple.
Entonces, la pregunta es: ¿Cómo manejo este escenario correctamente?
Bien, hasta ahora, lo he obtenido ;-) Lo que no he conseguido aún es: Supuse que mi evento PurchaseOrderStortada _today_ no contiene el IVA. Ahora, avance rápido en algún punto en el futuro, donde lo haga. Por supuesto que puedo crear un nuevo evento, básicamente V2.0, que contiene el IVA, pero eso no me ayuda con todos los pedidos del pasado, ¿o sí? ¿Cómo puedo lidiar con eso? –
Puede cambiar la estructura del modelo y la estructura de los eventos de forma independiente. Una vez que su modelo se amplía con una nueva información (como el IVA), los manejadores del evento anterior simplemente permanecen tal como están o establecen la nueva propiedad a un valor predeterminado. Al igual que lo haría al agregar una nueva columna en una tabla de base de datos: La nueva columna debe establecerse en nulo o en algún valor predeterminado para todas las entradas históricas. Cada vez que se repita un evento o se use para hidratar un modelo de lectura, el nuevo campo se establecerá con el valor predeterminado que necesite. –
Bien, gracias, tiene sentido :-)! –