CQRS Event Sourcing: Valider le nom d'utilisateur de l'unicité

Prenons un simple "Inscription en Compte", par exemple, en voici le déroulement:

  • Visite de l'utilisateur sur site
  • Cliquez sur "s'Inscrire" et remplissez le formulaire, cliquez sur le bouton "Enregistrer"
  • MVC Contrôleur: Valider le nom d'utilisateur de l'unicité par la lecture de ReadModel
  • RegisterCommand: Valider le nom d'utilisateur de l'unicité de nouveau (là est la question)

Bien sûr, nous pouvons valider le nom d'utilisateur de l'unicité par la lecture de ReadModel MVC contrôleur pour améliorer les performances et l'expérience utilisateur. Cependant, nous avons encore besoin de valider l'unicité de nouveau dans RegisterCommand, et, évidemment, nous ne devrions PAS accès ReadModel dans les Commandes.

Si nous n'utilisons pas d'Event Sourcing, nous pouvons interroger le modèle de domaine, donc ce n'est pas un problème. Mais si nous sommes à l'aide d'Event Sourcing, nous ne sommes pas en mesure d'interroger modèle de domaine, de sorte comment peut-on valider le nom d'utilisateur de l'unicité dans RegisterCommand?

Avis: classe Utilisateur dispose d'un Identifiant de propriété, et le nom d'utilisateur n'est pas la propriété de la clé de l'Utilisateur de la classe. Nous ne pouvons obtenir le domaine de l'objet par l'Id lors de l'utilisation d'event sourcing.

BTW: Dans l'obligation, si le nom d'utilisateur est déjà pris, le site doit afficher un message d'erreur "Désolé, le nom d'utilisateur XXX n'est pas disponible" pour le visiteur. Il n'est pas acceptable pour afficher un message, dire, "Nous sommes la création de votre compte, veuillez patienter, nous allons envoyer le résultat d'inscription par e-Mail plus tard", pour le visiteur.

Des idées? Merci beaucoup!

[Mise à JOUR]

Un exemple plus complexe:

Exigence:

Lors de la passation de commande, le système doit vérifier que le client de la commande de l'histoire, si il est un précieux client (si le client a placé à moins de 10 commandes par mois dans la dernière année, il a de la valeur), nous faisons 10% de rabais à l'ordre.

Mise en œuvre:

Nous créons PlaceOrderCommand, et dans la commande, nous avons besoin à la requête de la commande histoire de voir si le client est précieux. Mais comment pouvons-nous faire? Nous ne devrions pas accès ReadModel dans la commande! Comme Mikael dit, nous pouvons utiliser les commandes de compensation dans l'enregistrement d'un compte, par exemple, mais si nous utilisons également que, dans cet exemple de commande, il serait trop complexe, et que le code pourrait être trop difficile à maintenir.

InformationsquelleAutor Mouhong Lin | 2012-02-29