Recientemente comencé a investigar CQRS y DDD para un proyecto de campo verde que estoy a punto de comenzar. Estudié una gran cantidad de material de Udi Dahan, Greg Young, Mark Nijhof y otros. Estos fueron realmente muy útiles y creo que tengo una buena comprensión de los conceptos. Pero todavía hay ciertas preguntas en mi mente sobre cómo puedo aplicarlas a mi propio dominio.CQRS: cómo modelar un sistema de ejecución de escenarios
Mi sistema básicamente será un motor de reglas complejo, en el que las reglas dictarán el precio final de ciertos productos. Los administradores definirán las definiciones y reglas del producto en el sistema. Las reglas las diseñarán los administradores utilizando un conjunto predefinido de propiedades que pueden tener valores de un conjunto predefinido, como 'Propósito de compra' (revender, alquilar) o valores de forma libre, como Edad.
Cada producto tendrá un precio base, y las reglas básicamente se sumarán/eliminarán del precio base si se aplican.
Una regla de ejemplo muy simple podría ser:
del producto X, SI (Compra Propósito = revender y edad> 25) Añadir 25 $ al precio base.
Así que hay dos tipos de usuarios que usan el sistema, los administradores, que definen los productos, las reglas y los precios base; y otros usuarios que consultan los precios en función de un escenario en el que ingresan a través de una interfaz de usuario what-if.
Mi confusión aquí es esta: ejecutar un escenario no cambia el estado del dominio en absoluto, ningún otro sistema externo/persona está interesado en el resultado de la ejecución del escenario sino el propio usuario en ejecución - devuelve el resultado de un cálculo de precio después de ejecutar las reglas aplicables para el escenario dado. Por ejemplo, el usuario puede seleccionar Producto X y consultar los precios para un escenario dado, como (Purchase Purpose = Reventa y Age = 40). De nuevo, dado que esta operación no cambia el estado del dominio, creo que es una consulta. Pero, hay un motor de reglas operando en el escenario para calcular el precio final, que supongo se puede categorizar como la lógica de dominio que se está ejecutando. Entonces, ¿a dónde pertenece esta lógica? ¿Es esta una consulta que solo funciona con el modelo de lectura, o ejecuta un escenario, un comando que debe ejecutarse en el modelo de dominio? De nuevo, parece que la capa de dominio es el lugar adecuado para estas reglas, pero ¿cómo paso el resultado de la ejecución del escenario al usuario? (Se siente como una consulta que piensa de esta manera). O tal vez, CQRS no es la solución correcta para este problema en particular?
+1 por decirme que hay un patrón [cqrs] (http://blog.fossmo.net/post/Command-and-Query-Responsibility-Segregation-%28CQRS%29.aspx) del que nunca he hablado antes de. – k3b