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

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.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.