2010-04-30 9 views
3

Comment structureriez-vous le code d'appel d'un service wcf dans l'application silverlight?Meilleure pratique pour l'utilisation du service Wcf par Silverlight?

Utilisant only-once instancié wcf service-proxy (aka singleton) et l'utiliser à travers l'ensemble de l'application SL? Si oui, comment avez-vous résolu les contrôles de désabonnement de l'événement ws-call-completed?

ou

la création du service proxy WCF pour chaque ws appel? Où fermez-vous le proxy alors?

Répondre

7

Voici la structure d'application que je trouve pratique:

  • application est divisée en modules (Prisme, mais peut être quelque chose) - module par fonction verticale.
  • Chaque module a son propre ensemble de classes client de service (généré par slsvcutil)
  • Pour chaque client de service de classe partielle J'ai une autre classe partielle générée où pour chaque méthode de service que j'ai une version qui retourne IObservable.

    E.g. si mon client de service a une méthode GetAllMyDataAsync() et l'événement GetAllMyDataCompleted la signature de méthode générée sera IObservable<MyDataDto[]> GetMyData() Cette méthode traitera de l'abonnement/désabonnement à un événement, de l'authentification, de la gestion des erreurs et d'autres problèmes d'infrastructure.

    appeler ainsi-service Web devient simplement:

    new MyServiceClient().GetAllMyData().Subscribe(DoSomethingWithAllMyData)

    Avec ce que je peux facilement joindre les données à partir de plusieurs demandes, par exemple (Strictement à des fins de démonstration, ne pas essayer en application réelle):

    var des = (from d in new MyServiceClient().GetMyDataItem() 
          from e in new MyServiceClient().GetDataItemEnrichment(d) 
          select new EnrichedData { Data = d, Enrichment = e}); 
    des.Subscribe(DoSomethingWithEnrichedData); 
    
  • Une fois que l'application est plus complexe (par exemple, les données sont partagées par plusieurs composants, vous ajoutez la messagerie qui met à jour dynamiquement les données initialement récupérées, etc. Il est utile d'ajouter un autre élément dans la pile - Modèle.

    Par conséquent si j'ai un service MyDataService je aurais une classe de modèle appelée MyDataServiceModel. Il sera enregistré dans le conteneur comme singleton et il sera injecté dans viewmodels qui en a besoin. Ainsi viewmodels parlent à cette classe quand ils ont besoin de données (donc plutôt que d'appeler MyServiceClient.GetAllMyData qu'il appellerait MyDataServiceModel.GetAllMyData.

    De cette façon viewmodels sont complètement indépendants de la pile de WCF (plus facile à se moquer, plus facile à tester) De plus, ces classes de modèles prennent en charge :

    • transformation des données de/vers DTO
    • enrichissant et en combinant les données (une méthode de modèle peut extraire des données provenant de plus d'une demande)
    • problèmes de manipulation comme étranglant (par exemple scénario typique, quelque chose sélectionnée par l'utilisateur dans un combobox, cela a provoqué quête à envoyer à un serveur pour récupérer une donnée pour cette sélection, pendant que cette requête est en cours d'exécution, l'utilisateur a fait un autre changement, mais pour une raison quelconque, les réponses sont hors service), etc.
    • combinaison de données tirées de la charge initiale par WCF avec des données poussées par le service au cours de la session
+1

Pouvez-vous expliquer s'il vous plaît, comment vous générez le service version méthode qui retourne IObservable? Avec T4 ou autre chose? – Harm

Questions connexes