visual tipos tipo studio puede otro objeto implícitamente datos convertir convert conversion c# asp.net web-services

c# - studio - Resultados del servicio web ASP.NET, clases de proxy y conversión de tipos



tipos de datos en c# pdf (3)

Todavía soy nuevo en el mundo de ASP.NET, por lo que podría estar fuera de la base aquí, pero hasta ahora esto es lo mejor de mi (limitado) conocimiento.

Digamos que tengo un objeto de negocio estándar "Contacto" en el espacio de nombres Comercial . 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 decir Utils.BuyContactNewHat() . Que por supuesto toma el contacto de tipo Business.Contact .

Luego vuelvo a la aplicación de mi cliente y quiero utilizar el método BuyContactNewHat , así que agrego una referencia al espacio de nombres de mi Utils y allí está. Sin embargo, surge un problema con:

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

Dado que el tipo de devolución de GetContact es MyWebService.Contact y no Business.Contact como se esperaba. Entiendo por qué es así, porque al acceder a un servicio web, en realidad está programando contra la clase proxy generada por el WSDL.

Entonces, ¿hay una manera "más fácil" de lidiar con este tipo de desajuste? Estuve considerando quizás intentar crear una clase de convertidor genérico que use la reflexión para asegurar que dos objetos tengan la misma estructura, que simplemente transfiriendo los valores de uno a otro.


Estás en el camino correcto. Para volver a obtener los datos del objeto proxy en uno de sus propios objetos, debe hacer el código de la mano izquierda con la mano derecha. es decir, copiar los valores de las propiedades. Apuesto a que ya existe un método genérico que utiliza la reflexión.

Algunas personas usarán algo más que un servicio web (.net remoto) si solo quieren obtener un objeto comercial a través del cable. O usarán serialización binaria. Supongo que está utilizando el servicio web por alguna razón, por lo que tendrá que copiar la propiedad.


En realidad, no tiene que usar la clase generada que le proporciona el WSDL. Si echas un vistazo al código que genera, solo está realizando llamadas a algunas clases de .NET Framework para enviar solicitudes SOAP. En el pasado he copiado ese código en un archivo .cs normal y lo he editado. Aunque no lo he probado específicamente, no veo ninguna razón por la que no pueda eliminar la definición de la clase proxy y usar la clase original para recibir los resultados de la llamada SOAP. Ya debe estar haciendo una reflexión bajo el capó, parece una pena hacerlo dos veces.


Le recomendaría que estudie la posibilidad de escribir una Extensión del importador de esquemas, que puede usar para controlar la generación del código proxy. Este enfoque se puede usar para (con gracia) resolver su problema sin kludges (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