2008-08-09 7 views
7

Je suis encore nouveau dans le monde ASP.NET, donc je pourrais être loin de la base ici, mais jusqu'à présent, c'est le meilleur de mes connaissances (limitées) ! Disons que j'ai un objet métier standard "Contact" dans l'espace de noms Business. J'écris un service Web pour récupérer les informations d'un contact à partir d'une base de données et le renvoyer. J'écris ensuite une application client pour demander les détails.Résultats du service Web ASP.NET, classes de proxy et conversion de type

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

Je reviens ensuite à mon application client et je veux utiliser la méthode BuyContactNewHat, donc j'ajoute une référence à mon espace de noms Utils et 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 non Business.Contact comme prévu. Je comprends pourquoi, car lors de l'accès à un service Web, vous êtes en train de programmer sur la classe proxy générée par le WSDL.

Alors, y a-t-il une façon "plus facile" de gérer ce type de discordance? Je pensais peut-être à essayer de créer une classe générique de convertisseurs qui utilise la réflexion pour s'assurer que deux objets ont la même structure, que de simplement transférer les valeurs de l'un à l'autre.

Répondre

4

Vous êtes sur la bonne voie. Pour récupérer les données de l'objet proxy dans l'un de vos propres objets, vous devez faire du code main gauche-main droite. c'est-à-dire copier les valeurs de propriété. 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 (.net remoting) si elles veulent simplement obtenir un objet métier à travers le réseau. Ou ils vont utiliser la sérialisation binaire. Je suppose que vous utilisez le service Web pour une raison, vous devrez donc faire des copies de propriété.

4

Vous n'avez pas réellement besoin d'utiliser la classe générée que le WSDL vous donne. Si vous jetez un coup d'oeil sur le code qu'il génère, il fait simplement des appels dans certaines classes de framework .NET pour envoyer des requêtes SOAP. Dans le passé, j'ai copié ce code dans un fichier .cs normal et l'ai édité. Bien que je n'ai pas essayé cela spécifiquement, je ne vois aucune raison pour laquelle vous ne pourriez pas abandonner la définition de classe de 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, il semble dommage de le faire deux fois.

1

Je vous recommande 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 (gracieusement) résoudre votre problème sans kludges (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 mettez à jour la référence Web).

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

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

Questions connexes