Resultados del servicio web ASP.NET, clases de proxy y conversión de tipos
-
08-06-2019 - |
Pregunta
Todavía soy nuevo en el mundo ASP.NET, por lo que podría estar muy equivocado aquí, pero hasta ahora, ¡esto es lo mejor que tengo (limitado) conocimiento!
Digamos que tengo un objeto comercial estándar "Contacto" en el Negocio espacio de nombres.Escribo un servicio web para recuperar la información de un contacto de una base de datos y devolverla.Luego escribo una solicitud de cliente para solicitar dichos detalles.
Ahora, también creo un método de utilidad que toma un "Contacto" y hace algo de magia con él, como Utils.BuyContactNewHat()
decir.Que por supuesto toma el tipo de contacto. Business.Contact
.
Luego vuelvo a mi aplicación cliente y quiero utilizar el BuyContactNewHat
método, así que agrego una referencia a mi Utilidades espacio de nombres y ahí está.Sin embargo, surge un problema con:
Contact c = MyWebService.GetContact("Rob);
Utils.BuyContactNewHat(c); // << Error Here
Dado que el tipo de retorno de GetContact
es de MyWebService.Contact
y no Business.Contact
como se esperaba.Entiendo por qué esto se debe a que al acceder a un servicio web, en realidad estás programando contra la clase de proxy generada por el WSDL.
Entonces, ¿existe una forma "más fácil" de abordar este tipo de desajuste?Estaba considerando quizás intentar crear una clase de convertidor genérica que use la reflexión para garantizar que dos objetos tengan la misma estructura que simplemente transferir los valores de uno a otro.
Solución
Estás en el camino correcto.Para recuperar los datos del objeto proxy en uno de sus propios objetos, debe escribir código de izquierda a derecha.es decir.copiar valores de propiedad.Te apuesto a que ya existe un método genérico que utiliza la reflexión.
Algunas personas utilizarán algo más que un servicio web (comunicación remota .net) si solo quieren transmitir un objeto comercial.O usarán serialización binaria.Supongo que estás utilizando el servicio web por alguna razón, por lo que tendrás que copiar la propiedad.
Otros consejos
En realidad, no es necesario utilizar la clase generada que le proporciona el WSDL.Si observa el código que genera, simplemente realiza llamadas a algunas clases de .NET framework para enviar solicitudes SOAP.En el pasado copié ese código en un archivo .cs normal y lo edité.Aunque no he probado esto específicamente, no veo ninguna razón por la que no puedas eliminar la definición de clase de proxy y usar la clase original para recibir los resultados de la llamada SOAP.Ya debe estar reflexionando bajo el capó, parece una pena hacerlo dos veces.
Le recomendaría que considere escribir una extensión de importador de esquemas, que puede usar para controlar la generación de código proxy.Este enfoque se puede utilizar para resolver (elegantemente) su problema sin rodeos (como copiar objetos de un espacio de nombres a otro, o modificar la clase reference.cs generada por el proxy solo para reemplazarla la próxima vez que actualice la referencia web).
Aquí hay un (muy) buen tutorial sobre el tema:
http://www.microsoft.com/belux/msdn/nl/community/columns/jdruyts/wsproxy.mspx