Web Services y Polimorfismo

28/05/2004 - 21:32 por Enrique | Informe spam
¿puede un webservice recibir como parámetros objetos
polimórficos?. Tengo una clase abstracta en c# y deseo que
un webservice reciba como parámetro un objeto de cualquier
heredera de esta ¿es posible?
 

Leer las respuestas

#1 CESAR DE LA TORRE [Microsoft MVP]
01/06/2004 - 23:00 | Informe spam
Lo mas parecido al polimorfismo en parámetros de WebServices es por ejemplo
definir como retorno de WebMethod un tipo de clase 'padre' y enviar sin
embargo un objeto con tipo de clase hija. Lo que es imprescindible en
cualquier caso es que las clases 'custom' que quieras pasar sean
SERIALIZABLES, es decir, clase que implementen el atributo [Serializable] o
bien si quieres mas control en la serialización, que implemente el interface
ISerializable.
Ejemplo del caso anterior (Clase padre como declaración de parámetro e
instancia de clase hija como objeto devuelto en el parámetro), es por
ejemplo definir el retorno de un WebMethod con la clase DataSet y sin
embargo devolver un objeto cuyo tipo sea un TypedDataSet llamada dicha clase
por ejemplo Factura, la cual deriva de DataSet. Lo mismo podrías hacer con
una clase padre tuya, por ejemplo 'Polígono' y una clase derivada llamada
'Rectángulo', etc.

Lo mas importante que debes tener en cuenta es que los XML WebServices NO
están diseñados hoy por hoy para hacer Polimorfísmo real instanciando
objetos de Negocio (con métodos implementando lógica de negocio, acciones,
etc.) en el servidor y pasando dicho objeto al 'cliente' del WebService para
que allí (en el 'cliente') se ejecuten dichos métodos. Los WebServices NO
están diseñados para eso.
Los WebServices deben devolver siempre DATOS, en forma de tipos de datos
(string, int, etc.), XML puro, y por supuesto clases que implementen
estructuras mas complejas de datos, es decir, lo que a nivel de Arquitectura
de Software se llama Clases de 'Entidades de Negocio'. Estas clases de
'Entidades de Negocio' son por ejemplo DataSets, TypedDatasets, y/o clases
tuyas (custom business entities classes) especialmente diseñadas para
recoger 'datos y colecciones de datos desconectados', serializarse (mediante
[Serializable] o ISerializable) y pasar estos datos al punto remoto
'cliente' del WebService.

La idea es que los componentes de negocio y fachada de negocio (Business
Components y Business Façade Components) estén en el servidor y se ejecuten
en el servidor mediante los WebMethods de los WebServices, y devuelvan al
programa 'cliente' las Entidades de Negocio (Conjuntos o colecciones de
Datos desconectados).

A parte de que lo anterior es la 'forma de trabajar recomendada' con los
WebServices, el problema que tienes para hacer polimorfismo con los
parçametros (Una Clase con métodos Abstractos y clases hijas que implemente
dichos métodos, y pasar esas instancias de clases hijas al cliente del
WebService) es que los WebServices están desacoplados (al contrario que DCOM
o .NET REMOTING), es decir, que el objeto que se obtiene en el cliente es
realmente otro diferente creado por la 'Clase Proxy' del WebService, y el
cliente NO conoce realmente dicho tipo/clase (en cambio en DCOM o en
REMOTING el cliente tiene que tener una referencia a una .DLL con dichas
clases aunque no se ejecute en local). Con los WebServices lo único que
puedes obtener entonces son los datos de las clases que has pasado como
parámetros, pero NO la lógica de ejecución de los métodos de dicho objeto,
porque lo que se serializan son los datos de las propiedades miembro de la
clase, pero no los métodos (lógica de ejecución).

Si quieres tener una visión mas completa de los aspectos de Arquitectura de
Software interna recomendada con los WebServices, lee el siguiente artículo:
http://msdn.microsoft.com/library/e...frame=true

César de la Torre
[Microsoft MVP - .NET XML WebServices]
[MCSE] [MCT]

Renacimiento
Microsoft GOLD Certified Partner
www.renacimiento.com


"Enrique" wrote in message
news:1467301c444ea$829d27f0$
¿puede un webservice recibir como parámetros objetos
polimórficos?. Tengo una clase abstracta en c# y deseo que
un webservice reciba como parámetro un objeto de cualquier
heredera de esta ¿es posible?

Preguntas similares