02.04.08

¿Servicios Web Polimórficos? (Parte I – Intentando solucionar el problema mediante .NET Framework 2.0)

Posted in .NET, Programación, Servicios Web, Web at 10:45 pm by Miguel

No sé si os habéis planteado alguna vez la posibilidad de aplicar el concepto de polimormisfo en un servicio web.

Es curioso pero así como cuando hablamos de la programación orientada objetos lo del polimorfismo está en boca de todos, cuando se habla de servicios web dicho concepto parece que se pierde y que no tenga sentido aplicarlo.

¿Se os ocurre un ejemplo de cómo sacarle utilidad? Seguro que sí. De todas maneras, os he preparado un ejemplo de lo que sería uno de los usos, para que tengáis una idea de cómo sería la forma de un servicio web polimórfico. El ejemplo está escrito en VB.NET utilizando el framework 2.0 de .NET.

Servicio Web Polimorfico

Antes de nada (y sobre todo antes de que alguno se emocione con la idea) avanzaros que el ejemplo no es efectivo, porque con la versión 2.0 no se puede aplicar el polimorfismo en servicios web (de ahí el título del post). Pero, seguro que servirá para haceros una idea de lo que se intenta transmitir en el post. Además, para poder seguir bien el ejemplo tendréis que conocer el funcionamiento de los patrones de diseño DAO y DTO (en el blog hay unos cuantos posts al respecto los cuales podéis consultar para poneros al día).

En el ejemplo podréis ver que tenéis un de servicio web en el que se presentan dos capas, la de negocio (BL) y la de acceso a datos (DL).

En la capa de acceso a datos está implementada una factoría de DAO implementando el patrón factoría.

Public Class DAOFactory

    Public Shared Function GetDAO(ByVal dto As IDTO) As IDAO   

      If TypeOf (dto) Is Coche.CocheDTO Then
          Return Coche.CocheDAO.GetInstance   
      ElseIf TypeOf (dto) Is Marca.MarcaDTO Then
          Return Marca.MarcaDAO.GetInstance   
      Else
          Throw New DAONoDefinidoException   
      End If

    End Function

End Class

Veréis además que los DAO a parte de heredar de la clase BaseDAO implementan la interfaz IDAO la cual define cuáles son los métodos que debe implementar obligatoriamente cada DAO.

Public Class MarcaDAO : Inherits BaseDAO : Implements IDAO

Para finalizar, los DTO heredan todos de la clase IDTO la cual define una propiedad común a todos los DTO, la propiedad Id, que define el valor que identifica a un DTO de forma única. He dejado medio implementados dos DAO, CocheDAO y MarcaDAO para que se vea un poco mejor la forma de todo.

En la capa de lógica de negocio veréis que hay un único servicio, llamado service.vb. En el se definen los siguientes métodos

Execute

Recibe por parámetro un IDTO y una acción posible a ejecutar. Con el IDTO recibido y utilizando la factoría de DAO’s genera un DAO mediante el cual lleva a cabo la acción a realizar.

Public Sub Execute(ByVal dto As IDTO, ByVal theAction As ExecuteAction)

GetUnique

A partir de una id y la factoría de DAO retorna un DTO.

Public Function GetUnique(ByVal dto As IDTO) As IDTO

GetMoreThanOne

A partir de un IDTO y una posible acción a ejecutar retorna una lista genérica de IDTO.

Public Function GetMoreThanOne(ByVal dto As IDTO, ByVal theAction As SelectAction) As List(Of IDTO)

Qué fantástico sería que funcionara esto ya que como véis desde la capa de presentación no dispondremos de un servicio web de Insert, Update, Delete y consultas restantes por cada entidad en la capa de acceso a datos, si no que tenemos un único servicio, un único interfaz, que luego internamente, una vez recibido el DTO correspondiente lanzará en tiempo de ejecución (mediante polimorfismo) la llamada al método de la capa de acceso a datos correspondiente. ¿Mola no? ¡Nos estaríamos ahorrando un montón de tiempo de desarrollo y de mantenimiento!

Ahora empieza el chiste de todo esto, ya que, ¿qué ocurre cuando mediante un cliente intentamos referenciar al servicio web? Pues que no sabe qué leches es un IDTO. Esto es debido a que el WSDL que se genera automáticamente no ha definido cuáles son las clases que están en el servicio y que heredan IDTO. Esto es un problemón y es lo que tira para abajo toda esta solución. Probad a referenciar el servicio desde un cliente, añadiendo la referencia y veréis que en el parámetro IDTO lo define así “<idto/>” y santas pascuas, no sabe nada más.

Qué penita, esto no nos vale para nada, pero al menos ha servido para introducir el tema y plantear con los siguientes posts soluciones alternativas al mismo :)

Nos vemos en la siguiente parte.

Un saludo.

Miguel.

Rating 3.00 out of 5
[?]

Leave a Comment

Please copy the string LOiUd6 to the field below: