Question

Je suis encore nouveau dans le monde ASP.NET, donc je pourrais être loin de la base ici, mais jusqu'à présent, c'est au meilleur de mes connaissances (limitées) !

Disons que j'ai un objet métier standard "Contact" dans le Entreprise espace de noms.J'écris un service Web pour récupérer les informations d'un contact à partir d'une base de données et les renvoyer.J'écris ensuite une application client pour demander ces détails.

Maintenant, je crée également une méthode utilitaire qui prend un "Contact" et fait de la magie avec, comme Utils.BuyContactNewHat() dire.Ce qui prend bien sûr le Contact de type Business.Contact.

Je retourne ensuite à mon application client et souhaite utiliser le BuyContactNewHat méthode, j'ajoute donc une référence à mon Utilitaires espace de noms et le voilà.Cependant, un problème se pose avec :

Contact c = MyWebService.GetContact("Rob);
Utils.BuyContactNewHat(c); // << Error Here

Depuis le type de retour de GetContact est de MyWebService.Contact et pas Business.Contact comme prévu.Je comprends pourquoi, car lorsque vous accédez à un service Web, vous programmez en réalité sur la classe proxy générée par le WSDL.

Alors, existe-t-il un moyen « plus simple » de gérer ce type d’inadéquation ?J'envisageais peut-être d'essayer de créer une classe de convertisseur générique qui utilise la réflexion pour garantir que deux objets ont la même structure plutôt que de simplement transférer les valeurs de l'un à l'autre.

Était-ce utile?

La solution

Tu es sur la bonne piste.Pour récupérer les données de l'objet proxy dans l'un de vos propres objets, vous devez faire du code gauche-droite.c'est à dire.copier les valeurs des propriétés.Je vous parie qu'il existe déjà une méthode générique qui utilise la réflexion.

Certaines personnes utiliseront autre chose qu'un service Web (accès à distance .net) si elles souhaitent simplement transmettre un objet métier via le réseau.Ou ils utiliseront la sérialisation binaire.Je suppose que vous utilisez le service Web pour une raison, vous devrez donc effectuer une copie des propriétés.

Autres conseils

Vous n'êtes pas réellement obligé d'utiliser la classe générée que le WSDL vous donne.Si vous regardez le code qu'il génère, il s'agit simplement d'appeler certaines classes du framework .NET pour soumettre des requêtes SOAP.Dans le passé, j'ai copié ce code dans un fichier .cs normal et je l'ai modifié.Bien que je n'aie pas essayé cela spécifiquement, je ne vois aucune raison pour laquelle vous ne pourriez pas supprimer la définition de classe proxy et utiliser la classe d'origine pour recevoir les résultats de l'appel SOAP.Il faut déjà faire de la réflexion sous le capot, ça semble dommage de s'y prendre à deux fois.

Je vous recommande d'envisager d'écrire une extension d'importateur de schéma, que vous pouvez utiliser pour contrôler la génération de code proxy.Cette approche peut être utilisée pour résoudre (gracieusement) votre problème sans tracas (comme copier des objets d'un espace de noms à un autre, ou modifier la classe reference.cs générée par proxy uniquement pour la remplacer la prochaine fois que vous mettrez à jour la référence Web).

Voici un (très) bon tutoriel sur le sujet :

http://www.microsoft.com/belux/msdn/nl/community/columns/jdruyts/wsproxy.mspx

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