De acuerdo con Fowler (here), un repositorio "media entre el dominio y las capas de mapeo de datos, actuando como una colección de objetos de dominio en memoria". Entonces, por ejemplo, en mi aplicación Courier Service, cuando se envía una nueva ejecución, mi servicio de aplicación crea un nuevo objeto raíz Agregado de ejecución, lo rellena con valores de la solicitud y luego lo agrega al RunRepository antes de llamar a la Unidad de trabajo para guardar los cambios a la base de datos. Cuando un usuario desea ver la lista de ejecuciones actuales, consulto el mismo repositorio y devuelvo un DTO desnormalizado que representa la información.¿Cómo encajan los repositorios con CQRS?
Sin embargo, al mirar CQRS, la consulta no llegaría al mismo repositorio. En cambio, tal vez iría directamente contra el almacén de datos y siempre se desnormalizaría. Y mi lado de comando evolucionaría a un NewRunCommand y Handler que crearía y poblaría un objeto de dominio NewRun y luego conservaría la información en el almacén de datos.
Entonces, la primera pregunta es dónde encajan los repositorios en el modelo CQRS si no mantenemos una colección en memoria (caché, si se quiere) de objetos de dominio?
Considere el caso en que la información presentada a mi servicio de aplicación no contiene nada más que una serie de valores de ID que el servicio debe resolver para construir el objeto de dominio. Por ejemplo, la solicitud contiene el ID # del servicio de mensajería asignado a la ejecución. El servicio debe buscar el objeto real de Courier en función del valor de ID y asignar el objeto a NewRun utilizando el método AssignCourier (que valida el servicio de mensajería y realiza otra lógica comercial).
La otra pregunta es, dada la separación de las consultas y la posible ausencia de repositorios, ¿cómo realiza el servicio de la aplicación la búsqueda para encontrar el objeto de dominio Courier?
ACTUALIZACIÓN
basado en alguna lectura adicional y después pensaron comentario Dennis', voy a reformular mis preguntas.
Me parece que CQRS anima repositorios que no son más que fachadas sobre los mecanismos de acceso a datos y almacenamiento de datos. Dan la "apariencia" de una colección (como describe Fowler) pero no están administrando las entidades en la memoria (como señaló Dennis). Esto significa que cada operación en el repositorio es de paso, ¿sí?
¿Cómo una unidad de trabajo encaja en este enfoque? Normalmente, una UoW se utiliza para confirmar los cambios realizados en un repositorio (¿no?) Pero si el repositorio no mantiene las entidades en la memoria, ¿qué función tiene una UoW?
Con respecto a una operación de "escritura", ¿tendría el controlador de comandos una referencia al mismo repositorio, un repositorio diferente o quizás una UoW en lugar de un repositorio?
La definición de Fowler difiere ligeramente del patrón de repositorio de Eric Evan como lo describe en el libro DDD. Creo que CQRS se inclina hacia la definición de Evan. –
Por favor explique. La única diferencia que puedo ver es el aspecto "en memoria" pero el uso sería el mismo, ¿verdad? – SonOfPirate