8
votes

"Utilisation" de deux bibliothèques différentes avec des fonctions presque identiques

Je prends un service Web SOAP. Le service Web désigne une URL de service séparée pour chacun de ses clients. Je ne sais pas pourquoi ils font ça. Toutes leurs fonctions et paramètres sont techniquement les mêmes. Mais si je veux écrire un programme pour le service, je dois savoir pour chaque entreprise est-il destiné. Cela signifie pour une entreprise appelée "Apple", je dois utiliser les éléments suivants à l'aide de la déclaration: xxx

et pour l'autre appelé "orange" xxx < P> Mais j'aimerais que mon programme puisse travailler pour tous et avoir le nom de la société ou le point de référence de service comme paramètre.

Mise à jour : Si j'ai Pour écrire une application distincte pour chaque client, je devrais les garder tous mises à jour les uns avec les autres avec chaque petit changement et que ce serait un diable d'un travail inefficace, le nombre de clients augmentant.

peut Quelqu'un pense-t-il à une solution? Je serai reconnaissant.


7 commentaires

Je suppose que vous ajoutez actuellement la référence du service Web en utilisant "Ajouter une référence de service", ai-je raison?


Je pense que vous voudrez peut-être utiliser un motif d'adaptateur, ou un autre modèle de conception (la façade vous vient également à l'esprit).


Qu'est-ce que l'espace de noms dans chaque espace de noms? modèle + contrat? événement si dmdelivery.apple.myfunction et dmdelivery.orange.myfunction semble être la même méthode, il n'est pas identique en fait. C'est un peu plus compliqué.


Jetez un coup d'œil à la consommation de service Web dynamique / invoke / Invocation. Ce L'article de codeProject pourrait être utile.


@Ranhirucoray Oui, j'utilise la "Référence sur le service".


@Cybermaxs à l'intérieur de chaque espace de noms réside dans le modèle. Oui, ils ne seront pas la même fonction que je connaisse. C'est pourquoi je pose ces questions.


J'ai ajouté une mise à jour à la question expliquant le problème: "Si je dois écrire une demande distincte pour chaque client, je devrais les garder à jour les uns avec les autres avec chaque petit changement et ce serait un bon travail inefficace comme le nombre de clients augmente. "


3 Réponses :


0
votes

Si tout est identique et que ce n'est que l'adresse du point final différent, vous pouvez peut-être essayer de changer seulement cela avant d'appeler les méthodes de service Web.

MyWebServiceObject ws= new MyWebServiceObject();
ws.Endpoint.Address = new System.ServiceModel.EndpointAddress("http://www.blah.com/apple.asmx");


1 commentaires

J'ai beaucoup de cours dans mon programme. Que dois-je faire avec toutes ces déclarations "en utilisant"? Existe-t-il un moyen d'annoncer globalement une déclaration qui s'applique à toutes ces classes? Comme "Ajouter une importation utilisateur" dans vb.net.



0
votes
  1. Utilisez n'importe quel client dans votre implémentation. ex. Apple
  2. Écrivez un inspecteur de messages et joignez-le dans le point de départ
  3. En inspecteur des messages Remplacez l'espace de nom du type avec un espace de nom de client approprié. EX: Avant l'inspecteur des messages: myclinet.apple.type
    Après l'inspecteur des messages: myClient.orange.type, si le fournisseur est orange.

0 commentaires

3
votes

Si vous avez un contrat de base (interface) pour tous vos services, vous pouvez utiliser une sorte de usine pour instancier votre service de concret et avoir une référence à votre interface dans votre code client (code d'appel).

string fruitKind = //get it from configuration
IFruitService service = ServiceFactory.CreateService( fruitKind );
service.SomeOperation();


4 commentaires

Cela signifie-t-il que je devrais avoir une implémentation distincte du service pour chaque client (un pour Apple et une pour orange), tandis que presque toutes leurs fonctions sont les mêmes? Cela doublera la taille de mon code.


Non, ce que j'essaie de montrer, c'est que chaque service a sa propre implémentation et que vous dites "presque toutes leurs fonctions sont les mêmes", vous pouvez alors créer une interface (ou une classe de base) qui "cache" la mise en œuvre à l'appelant code. Dans ce cas, votre code d'appel ne sait pas s'il travaille avec un service "Apple" ou "Orange", il ne sait que cela fonctionne avec une implémentation d'une interface ifruitservice (ou un classe de base commune). De cette façon, vous n'écrivez que une fois le code pour votre client (code d'appel).


Cela semble raisonnable. et l'instance du service à appeler (Apple ou Orange) sera un paramètre d'entrée juste?


Droit. Ensuite, il appartient à vous (et en fonction de votre système) comment vous récupérez le "type" de service à utiliser: par configuration, un paramètre sur une méthode ou une classe ...