Question

Nous essayons CQRS . Nous avons une situation de validation où CustomerService (service de domaine) a besoin de savoir si oui ou non un client existe. Les clients sont uniques par leur adresse e-mail. Notre référentiel client (un référentiel générique) a seulement obtenir (id) et Ajouter (client). Comment le CustomerService savoir si le client existe?

Était-ce utile?

La solution

Jetez un oeil à ce blog: Définir la validation basée sur l'architecture CQRS .

Il aborde cette question. Il est une question complexe à traiter dans CQRS. Qu'est-ce que Bjarte suggère est d'interroger la base de données de rapports pour les adresses existantes de courrier électronique client et d'émettre un Compenser de commande (comme CustomerEmailAddressIsNotUniqueCompensatingCommand) retour au modèle de domaine si une adresse e-mail a été trouvé. Vous pouvez ensuite déclencher des événements appropriés, ce qui peut comprendre un UndoCustomerCreationEvent.

Lisez les commentaires sur le blog ci-dessus pour d'autres idées.

Adam D. suggère dans un commentaire que la validation est un problème de domaine. Par conséquent, vous pouvez stocker ReservedEmailAddresses dans un service qui facilite la création de la clientèle et est hydratée par des événements dans votre magasin d'événements.

Je ne suis pas sûr qu'il ya une solution facile à ce problème qui se sent tout à fait propre. Laissez-moi savoir ce que vous venez avec!

Bonne chance!

Autres conseils

questions ne doivent pas être que complexe:

  1. Vérifiez votre magasin de reporting pour l'unicité des clients avant de soumettre la commande UpdateCustomer.
  2. Ajouter une contrainte à votre DB pour l'unicité de l'adresse e-mail. Lors de l'exécution de la commande, gérer l'exception et envoyer une notification à l'utilisateur en utilisant un canal de réponse. (Enclos tir jamais des événements CustomerUpdated au magasin de rapports.

Utilisez la base de données pour ce qu'il est bon et ne vous attardez pas sur les limites ORM.

Ce message par Udi Dahan http://www.udidahan.com/ 2009/12/09 / clarifiées-CQRS / contient le paragraphe suivant:

« De plus, nous ne devrions pas avoir besoin d'accéder au magasin de requête pour traiter les commandes - tout Etat qui est nécessaire doit être gérée par la composante autonome -. Qui fait partie du sens de l'autonomie »

Je belive Udi a suggéré d'ajouter simplement une contrainte unique à la base de données.

Mais si vous ne vous sentez pas comme le faire, en fonction de la déclaration ci-dessus, je suggère simplement d'ajouter la méthode « ByEmail » au référentiel et faire avec elle - mais là encore Udi serait probablement une meilleure suggestion. .

Hope Je ne suis pas trop tard ... mais nous avons été confrontés à une situation similaire dans notre projet, nous avons en fait intercepter l'exécuteur testamentaire de commande et le joindre à l'ensemble des règles créées pour cette commande, qui utilise à son tour une requête pour aller chercher la données.

Donc dans ce cas, nous pouvons avoir une classe par le nom, CustomerEmailMustBeUniqueRule qui est récupéré par le RuleEngine lorsque la commande « RegisterCustomerCommand » est sur le point d'être exécuté par RegisterCustomerCommandExecutor. Cette classe de règle a la responsabilité d'interroger la base de données pour trouver si l'id existe e-mail et d'arrêter l'exécution en levant le drapeau invalide ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top