2016-09-10 1 views
3

Dans CQRS, Quelle est la meilleure façon de valider les commandes nécessitant un appel DB? Par exemple, j'ai Order agrégat qui valide une commande par exemple CommitOrder et je ne veux pas accepter cette commande à moins qu'il y ait assez de stock. Dans ce cas, comment un gestionnaire de commandes peut-il vérifier si j'ai un stock d'articles de commande ou non? Puis-je interroger le côté lecture de l'écriture?Validation de commande CQRS nécessitant un appel DB

Note: J'utilise akka pour la mise en œuvre

+0

Les commandes peuvent exécuter des requêtes mais les requêtes ne peuvent pas exécuter les commandes – CSharper

Répondre

7

Si un agrégat doit interroger le modèle de lecture pour effectuer la validation des règles, la façon habituelle de le faire est via un service de domaine - vous passez au service une interface qui spécifie le contrat de la requête, l'implémentation de ce contrat exécute la requête.

Mais vous devez rester conscient du fait que la réponse que vous obtenez en exécutant la requête est ancienne; les données stockées dans un autre agrégat ne peuvent pas être considérées comme "à jour".

Vous devriez également vérifier vos besoins; Dans de nombreux domaines, il est souhaitable d'accepter des commandes même si l'inventaire n'est pas disponible actuellement. Après tout, la commande est une opportunité d'ajouter de la valeur commerciale; vous ne voulez pas opposer votre veto à une préoccupation qui n'est pas pertinente. Cela est particulièrement vrai lorsque l'entreprise comprend déjà comment atténuer une exception «en rupture de stock». Rappelez-vous que les données des autres agrégats sont périmées. Il est tout à fait possible qu'une autre partie du système mette actuellement à jour les niveaux de stock afin que vous puissiez accepter la commande. Si vous ne pouvez pas relâcher les exigences de validation des commandes lorsque le stock n'est pas disponible et si le taux d'erreur lié à l'utilisation des données de requête obsolètes est trop élevé, vous devez redéfinir vos agrégats afin que le niveau de stock actuel soit dans la même limite de cohérence que l'ordre de validation.

+0

Merci pour votre réponse. Oui, je suis d'accord avec vous sur les exigences actuelles de l'industrie et sur les données périmées. Mon problème est celui de la conception où finalement vous rencontrerez cette question d'interroger la lecture de l'écriture. J'avais donc peur de bouger dans une direction qui m'abandonne dans l'enchevêtrement de la dépendance. Qu'en est-il de pousser la validation des commandes vers un service indépendant qui coordonne entre le côté écriture et le côté lecture? Si oui, la Saga peut-elle être utilisée ou dois-je créer un autre service et conserver la Saga uniquement pour le flux de travail? – Mutaz