Il semble être sans fin de la confusion quant à savoir si les commandes devrait ou ne devrait pas avoir des valeurs de retour. Je voudrais savoir si la confusion est tout simplement parce que les participants n'ont pas indiqué leur contexte ou les circonstances.
La Confusion
Voici des exemples de la confusion...
Udi Dahan, dit commandes ne sont pas "le retour d'erreurs pour le client," mais dans le même article , il montre un diagramme où les commandes en effet, les erreurs de retour au client.
Microsoft, Appuyez sur Store article stipule que "le commandement (...) ne renvoie pas de réponse", mais ensuite pour donner un ambiguë attention:
Comme champ de bataille, l'expérience se développe autour de CQRS, certaines pratiques de consolider et ont tendance à devenir de meilleures pratiques. En partie contraire à ce que nous venons de le mentionner... c'est un point de vue commun aujourd'hui de penser qu'à la fois le gestionnaire de commande et l'application nécessaire de savoir comment les opérations de transaction est allé. Les résultats doivent être connus...
- Jimmy Bogard dit "les commandes ont toujours raison", mais fait un effort supplémentaire pour montrer comment des commandes de retour void.
Eh bien, ne les gestionnaires de commande les valeurs de retour ou pas?
La Réponse?
S'inspirant de Jimmy Bogard "CQRS Mythes," je pense que la réponse à cette question dépend de ce que programmatique/contextuelle "quadrant" vous parlez de:
+-------------+-------------------------+-----------------+
| | Real-time, Synchronous | Queued, Async |
+-------------+-------------------------+-----------------+
| Acceptance | Exception/return-value* | <see below> |
| Fulfillment | return-value | n/a |
+-------------+-------------------------+-----------------+
L'acceptation (par exemple, cours de validation)
La commande "Acceptation" fait principalement référence à la validation. Sans doute les résultats de la validation doit être donné de façon synchrone à l'appelant, si oui ou non la commande "réalisation" est synchrone ou en file d'attente.
Cependant, il semble que de nombreux praticiens ne pas initier de validation à partir de l'intérieur du gestionnaire de commande. De ce que j'ai vu, c'est soit parce que (1) ils ont déjà trouvé un moyen fantastique pour gérer la validation au niveau de la couche application (c'est à dire un ASP.NET MVC contrôleur de la vérification de l'état valide via les annotations de données) ou (2) une architecture est en place, qui suppose les commandes sont soumises à un (en dehors du processus de bus ou de la file d'attente. Ces dernières formes de l'asynchronie généralement n'offrent pas synchrone de validation sémantique ou des interfaces.
En bref, beaucoup de designers peut vouloir le gestionnaire de commande afin de fournir des résultats de la validation en tant que (synchrone) valeur de retour, mais ils doivent vivre avec les restrictions de l'asynchronie des outils qu'ils utilisent.
Réalisation
Concernant la "réalisation" d'une commande, le client qui a émis la commande pourriez avoir besoin de savoir le scope_identity pour un enregistrement récemment créé ou peut-être l'échec de l'information - telles que "compte à découvert."
En temps réel, il semble qu'une valeur de retour qui fait le plus de sens; les exceptions ne devraient pas être utilisés pour communiquer des affaires liées à l'insuffisance des résultats. Cependant, dans une "file d'attente" contexte...les valeurs de retour naturellement pas de sens.
C'est là que la confusion peut peut-être se résumer ainsi:
Beaucoup (la plupart?) CQRS praticiens de supposer qu'ils vont maintenant ou dans l'avenir, intégrer un asynchronisme de cadre ou de la plateforme (un bus ou une file d'attente) et donc proclamer que les gestionnaires de commande n'ont pas de valeur de retour. Cependant, certains praticiens n'ont pas l'intention d'utiliser un tel événement piloté par les constructions, et donc ils approuvent les gestionnaires de commande qui (de manière synchrone) les valeurs de retour.
Ainsi, par exemple, je crois synchrone (requête-réponse) contexte a été utilisée lors de Jimmy Bogard fourni cet exemple de l'interface de commande:
public interface ICommand<out TResult> { }
public interface ICommandHandler<in TCommand, out TResult>
where TCommand : ICommand<TResult>
{
TResult Handle(TCommand command);
}
Son Mediatr produit est, après tout, un outil de mémoire. Compte tenu de tout cela, je pense que la raison Jimmy soigneusement pris le temps de produire un vide de retour d'une commande n'est pas parce que "les gestionnaires de commande ne doit pas avoir de valeur de retour," mais au lieu tout simplement parce qu'il voulait que son Médiateur classe d'avoir une interface cohérente:
public interface IMediator
{
TResponse Request<TResponse>(IQuery<TResponse> query);
TResult Send<TResult>(ICommand<TResult> query); //This is the signature in question.
}
...même si pas toutes les commandes d'avoir une véritable valeur à retourner.
Répéter et terminer
Suis-je correctement la capture pourquoi il y a une confusion sur ce sujet? Est-il quelque chose que je suis absent?