net microsoft ejemplo driven domain ddd domain-driven-design cqrs

domain driven design - microsoft - Consultas de dominio en CQRS



domain driven design.net core (4)

Estamos probando CQRS . Tenemos una situación de validación donde un Servicio al Cliente (servicio de dominio) necesita saber si existe o no un Cliente. Los clientes son únicos por su dirección de correo electrónico. Nuestro repositorio de clientes (un repositorio genérico) solo tiene Get (id) y Add (cliente). ¿Cómo debe el CustomerService averiguar si el Cliente existe?


Espero no llegar demasiado tarde ... pero enfrentamos una situación similar en nuestro proyecto, en realidad interceptamos el ejecutor de comandos y lo adjuntamos con el conjunto de reglas creadas para ese comando, que a su vez utiliza una consulta para obtener los datos.

Entonces, en este caso, podemos tener una clase por el nombre, CustomerEmailMustBeUniqueRule, que es buscada por RuleEngine cuando el comando "RegisterCustomerCommand" está a punto de ser ejecutado por RegisterCustomerCommandExecutor. Esta clase de regla tiene la responsabilidad de consultar la base de datos para encontrar si existe el ID de correo electrónico y detener la ejecución al elevar el indicador no válido ...


Este post de Udi Dahan http://www.udidahan.com/2009/12/09/clarified-cqrs/ contiene el siguiente párrafo:

"Además, no deberíamos tener que acceder al almacén de consultas para procesar comandos; cualquier componente que sea necesario debe ser administrado por el componente autónomo; eso es parte del significado de autonomía".

Creo que Udi sugirió simplemente agregar una restricción única a la base de datos.

Pero si no tienes ganas de hacer eso, en base a la declaración anterior, sugeriría simplemente agregar el método "ByEmail" al repositorio y terminar con esto, pero nuevamente, probablemente Udi tenga una mejor sugerencia ...


Este problema no tiene por qué ser tan complejo:

  1. Verifique que su almacén de informes sea único para el cliente antes de enviar el comando UpdateCustomer.
  2. Agregue una restricción a su base de datos para obtener exclusividad en la dirección de correo electrónico. Al ejecutar el comando, maneje la excepción y envíe una notificación al usuario utilizando un canal de respuesta. (Por lo tanto, nunca se activan los eventos de CustomerUpdated en el almacén de informes.

Utilice la base de datos para lo que es bueno y no se obsesione con las limitaciones de ORM.


Eche un vistazo a esta publicación del blog: establezca la validación basada en la arquitectura CQRS .

Aborda este mismo problema. Es un tema complejo de tratar en CQRS. Lo que Bjarte sugiere es consultar en la base de datos de informes las direcciones de correo electrónico del Cliente existentes y emitir un Comando de Compensación (como CustomerEmailAddressIsNotUniqueCompensatingCommand ) de nuevo al Modelo de Dominio si se encuentra una dirección de correo electrónico. A continuación, puede activar eventos apropiados, que pueden incluir UndoCustomerCreationEvent .

Lea los comentarios en la publicación del blog anterior para ideas alternativas.

Adam D. sugiere en un comentario que la validación es una preocupación de dominio. Como resultado, puede almacenar ReservedEmailAddresses en un servicio que facilita la creación de clientes y está hidratado por eventos en su tienda de eventos.

No estoy seguro de que haya una solución fácil para este problema que se sienta completamente limpia. Déjame saber lo que se te ocurre!

¡Buena suerte!