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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top