Question

J'ai lu le texte de Udi Dahan sur [séparation Commande requête et SOA] [1]. En pensant à la façon dont j'utiliser dans la pratique dans un système, je travaille actuellement sur soulevé quelques questions ...


1.

Considérez la situation suivante où j'ai une application WPF qui permet à l'utilisateur d'éditer une liste d'entrées:

L'application cliente est démarré. Au démarrage, il est abonné au service de commande qui va gérer et publier des modifications aux entrées et il interroge un service WCF pour la liste complète des entrées. Après avoir reçu la liste des entrées, toutes les modifications (par d'autres clients) qui peuvent avoir été publiés aux clients la file d'attente alors qu'il était occupé en attente d'une réponse de WCF sont fusionnés dans la liste.

Maintenant, pour moi, il semble y avoir un (probablement très faible) chance que le client est abonné juste après une commande responsable d'un changement a été manipulé et que la requête de service de WCS a commencé juste avant le même changement a été commis à la base de données . Dans cette situation, je vais finir avec des données incorrectes dans mon client qui ne sont pas (et ne sera jamais entrer dans) la synchronisation avec la base de données (sauf si l'application cliente est redémarré). Est-ce que ce problème existe vraiment et si elle le fait, comment faut-il régler?


2. Ma deuxième question porte sur la façon de concevoir / mettre en œuvre l'interface utilisateur:

L'utilisateur veut maintenant modifier une entrée dans la liste; une fenêtre apparaît, les données sont modifiées et le bouton OK est pressé: nous envoyons un message à notre gestionnaire de commandes pour gérer ce changement. L'utilisateur attend de voir soit une confirmation (l'entrée dans la liste change) ou une erreur message.

Maintenant, je peux essayer de gérer les choses dans l'interface utilisateur d'une manière « synchrone » (laissez l'utilisateur faire une chose à la fois, et le laisser attendre le succès ou l'échec avant qu'il ne laisse rien faire d'autre) de la façon suivante :

  1. Une fois que l'utilisateur appuie sur OK, désactivez toutes les commandes si aucune modification supplémentaire est possible.
  2. Créer une saga avec un délai d'attente qui attend ...? Le message de réponse? La notification publiée par le service de commande? Tous les deux?
  3. Lorsqu'un message de réponse est reçu les données de la liste est modifiée, les contrôles sont activés et nous fait - ou:
  4. Un délai d'attente se produit. Le message de commande a été mis en attente, de sorte que le changement sera finalement réalisée, alors que faire? Afficher un message à l'utilisateur ( « cela prend plus de temps que prévu ... »), permettre à tous les contrôles et changer les données du client une fois la notification reçue du service de commande? Mais si une erreur est renvoyée? L'utilisateur peut avoir commencé à faire quelque chose d'autre (peut-être éditer une autre entrée) et apparaître un message d'erreur d'une tentative d'édition précédente ne semble pas être une bonne idée.

Une autre approche serait probablement juste envoyer la commande et l'utilisateur peut poursuivre avec tout ce qu'il aime faire. Peut-être montrer toutes les commandes en cours dans une liste dans l'interface utilisateur quelque part, avec un indicateur de succès ou de l'échec et la possibilité pour l'utilisateur d'afficher le message d'erreur en cas d'échec. Étant donné que les délais d'attente sont exceptionnels et nous espérons que les réponses devraient normalement être reçus en quelques secondes signifierait que cette liste devrait normalement avoir au plus 1 commande exceptionnelle en elle .. Cela et le fait que je ne me souviens pas que j'ai jamais vu une interface utilisateur de faire les choses de cette façon signifie qu'il est probablement pas une bonne idée.

Et votre question est? ;)

Eh bien, je me demande comment d'autres personnes résolvent ce dans leurs interfaces utilisateur. Probablement il y a de meilleures façons de gérer les choses dans l'interface utilisateur que les deux façons peut-être pas si intelligent que je suis venu avec?

Toutes mes excuses pour le long texte et merci d'avance pour vos réponses.

[1]: http: // www.udidahan.com/2008/08/11/command-query-separation-et soa / "séparation Commande requête et SOA"

Était-ce utile?

La solution

Pour la question n ° 1, la solution standard pour effectuer des requêtes est de créer un magasin de requête persistante côté serveur que le client RPC-demande / réponses contre.

Pour la question n ° 2, la réponse est très dépendant du domaine - les types de commandes, la nature de la collaboration entre utilisateurs. Comme une règle globale, penser à des façons que vous pouvez modifier l'interface utilisateur et / ou les données / manipulation des commandes telles que les commandes ne presque jamais l'échec (à moins que nous parlons des utilisateurs malveillants).

L'espoir qui aide.

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