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: et pour l'autre appelé "orange" p> Mise à jour forte>: 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. P> peut Quelqu'un pense-t-il à une solution? Je serai reconnaissant. P> p>
3 Réponses :
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");
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.
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();
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 code> (ou un classe de base commune). De cette façon, vous n'écrivez que une fois b> 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 ...
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. "