Pregunta

Estamos probando CQRS . Tenemos una situación donde una validación a 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 atención al cliente (un repositorio genérico) solamente tiene Get (id) y Add (cliente). ¿Cómo debe la CustomerService averiguar si existe el cliente?

¿Fue útil?

Solución

Tome un vistazo a esta entrada del blog: conjunto de validación basada en el CQRS Arquitectura .

Se dirige a este mismo asunto. Es un tema complejo que tratar en CQRS. Lo que está sugiriendo es Bjarte para consultar la base de datos de informes para las direcciones de correo electrónico de los clientes existentes y emitir un comando de compensación (como CustomerEmailAddressIsNotUniqueCompensatingCommand) de nuevo al modelo de dominio, si se encontró una dirección de correo electrónico. A continuación, puede disparar eventos pertinentes, que pueden incluir un UndoCustomerCreationEvent.

Leer a través de los comentarios en el blog anterior para ideas alternativas.

Adam D. sugiere en un comentario que la validación es una preocupación dominio. Como resultado, puede almacenar ReservedEmailAddresses en un servicio que facilita la creación de clientes y se hidrata por los acontecimientos en su tienda de evento.

No estoy seguro de que hay una solución fácil a este problema que se siente completamente limpio. Déjame saber lo que te ocurrió!

Buena suerte!

Otros consejos

Estos problemas no tienen que ser tan complejo:

  1. Compruebe su tienda de informes para la unicidad del cliente antes de enviar el comando updateCustomer.
  2. Añadir una restricción a su base de datos para la unicidad de la dirección de correo electrónico. Al ejecutar el comando, manejar la excepción y enviar una notificación al usuario mediante un canal de respuesta. (Cercados Nunca arranques CustomerUpdated a la tienda de informes.

Utilice la base de datos por lo que es bueno para y no se colgó en ORM limitaciones.

Este mensaje por Udi Dahan http://www.udidahan.com/ 2009/12/09 / aclaradas-CQRS / contiene el siguiente párrafo:

"Además, no debería necesitar acceder al almacén de consulta para procesar comandos - cualquier estado que se necesita debe ser gestionado por el componente autónomo -. Eso es parte del significado de la autonomía"

Me creer Udi sugirió que la simple adición de una restricción única a la base de datos.

Sin embargo, si usted no tiene ganas de hacer que, basándose en la declaración anterior, sugeriría simplemente añadiendo el método "ByEmail" al repositorio y acabar de una vez - pero por otra parte Udi probablemente tendría una mejor sugerencia. .

Espero no estar demasiado tarde ... pero nos enfrentamos a una situación similar en nuestro proyecto, que en realidad interceptar el ejecutor de comandos y adjuntarlo con el conjunto de reglas creadas para ese comando, que a su vez utiliza una consulta para buscar el datos.

Así que en este caso, podemos tener una clase con el nombre, CustomerEmailMustBeUniqueRule que es exagerado por el RuleEngine cuando el comando "RegisterCustomerCommand" está a punto de ser ejecutado por RegisterCustomerCommandExecutor. Esta clase de reglas tiene la responsabilidad de consultar la base de datos para encontrar si el correo electrónico de identificación existe y detener la ejecución levantando la bandera no válida ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top