2009-01-27 4 views
0

J'ai une application client de service Web qui se connecte au service Web d'un tiers. La 3ème partie a mis à jour son service web, mon application client échoue maintenant avec les exceptions SOAP. Malheureusement, je ne peux pas simplement mettre à jour mon application pour qu'elle fonctionne avec le nouveau service Web, car certains de mes utilisateurs continueront d'utiliser l'ancien service Web. Donc, fondamentalement, je voudrais être en mesure de travailler avec l'une ou l'autre version du service Web en utilisant une seule version de mon application client.Choix de l'espace de nom 'using' au moment de l'exécution

Étant donné que Visual Studio génère un tas de code que je compile lors de l'ajout d'une référence Web, j'ai maintenant deux fichiers: un fichier généré pour chaque version du service Web. Les deux API sont en fait identiques, ce sont simplement les messages SOAP sous-jacents qui semblent avoir changé. J'ai mis chacun de ces fichiers générés dans leur propre espace de noms pour éviter les collisions. Donc maintenant je voudrais pouvoir choisir quel espace de noms utiliser lors de l'exécution (basé sur un paramètre de configuration).

Par exemple:

if (useOldVersion) 
    using OldVersionNamespace; 
else 
    using NewVersionNamespace; 

De toute évidence, cela ne marchera jamais car il n'y aurait aucun moyen de compiler le code qui fait référence à des éléments dans cet espace de noms. Existe-t-il un moyen facile de résoudre ce problème? Peut-être que je pourrais utiliser la réflexion pour faire ce dont j'ai besoin à l'exécution? La seule chose à laquelle je pense vraiment serait de copier/coller littéralement mon code actuel dans deux fichiers différents, la seule différence étant l'espace de noms utilisé en haut. Cela semble être une très mauvaise idée.

+0

Est-ce que ça doit être l'exécution? Si l'application utilise toujours la même version (l'une ou l'autre) pour un client spécifique, vous pouvez utiliser #if pour créer deux versions de l'application. – configurator

+0

Ouais, il doit être à l'exécution car certains utilisateurs finissent par passer au nouveau service Web et cela doit se produire sans qu'ils aient à mettre à jour l'application cliente. – Jason

Répondre

4

Faites en sorte que les deux ensembles de classes générées implémentent une interface commune. C'est assez facile avec les types partiels - vous n'avez pas du tout besoin de changer la classe générée, créez simplement une interface appropriée et ensuite un fichier avec les mêmes types que ceux générés, en disant qu'ils implémentent l'interface.

Ensuite, vous codez à l'interface, et choisissez quelle implémentation choisir en un seul endroit en fonction d'un fichier de configuration. L'avantage supplémentaire à ceci est que vous pouvez écrire des tests unitaires contre votre code, en se moquant du service Web.

+0

C'est probablement la solution la plus correcte, mais il y a un tas de classes (100+) chacune avec un tas de propriétés/méthodes/etc. Je suppose que j'espère une solution plus rapide ... – Jason

0

ne pourriez-vous pas utiliser une heure de compilation si?

#If (BuildType) 
using X; 
#else 
using Y; 
#endif 

texte http://msdn.microsoft.com/en-us/library/4y6tbswk.aspx[link] [1]

c'est rapide et sale. J'espère que cela pourra aider!

+0

Oups, juste vu le nouveau commentaire. vous vous êtes lancé dans une énigme! de toute façon, vous pouvez parler à votre fournisseur de services Web pour se garder rétrocompatible? * croise les doigts * –

Questions connexes