26 de diciembre de 2014

WCF Service y Entity Framework

En este ejemplo se muestra como trabajar un servicio WCF y Entity Framework utilizando las entidades creadas por el ORM como DTO para "ser consumidas" pues supone el caso particular en que el cliente necesita y trabajara con exactamente las mismas propiedades de las entidades generadas por el ORM  *--Leer el Disclaimer al final de la entrada --*

Se  creara un nuevo proyecto de tipo WCF Application Service con nombre EntityEx


Ahora debemos eliminar los siguientes elementos y agregar un nuevo item de tipo WCF Service con nombre WCFEntity segun la secuencia




Como complemento se agregara un nuevo proyecto de tipo biblioteca de clases llamada Entidades(aqui se guardaran las entidades creadas por el ORM) de paso eliminanmos la clase Class1.cs que crea por defecto la bilbioteca de clases, el solution explorer se muestra


Ahora se agregara el modelo de base de datos al proyecto EntityEx con nombre Modelo y se separaran las entidades tal como se muestra en este enlace con lo que el diagrama del modelo y la vista del explorador de soluciones quedan asi



Ahora dentro del proyecto de biblioteca de clases Entidades expandimos Modelo.tt y deberiamos tener las entidades creadas por el ORM tal como se muestra


Y trabajaremos con Employee.cs, el primer paso es agregar la referencia de System.Runtime.Serialization a todo el proyecto Entidades y luego decorar con el atributo[DataContract] y [DataMember] la entidad Employee


la clase Employee quedaria asi...hay personas que no colocan atributos a la propiedad de navegacion ni a los metodos, en este caso si coloco atributo a la propiedad de navegacion, depende de su proyecto si decoran o no esta propiedad

Ahora la interfaz IWCFEntity tendra el siguiente codigo


y la clase WCFEntity que implementa la interfaz se muestra a continuacion


como paso final debemos hospedar el servicio creado en IIS, para eso dejo este enlace que nos dara como resultado el servicio debidamente hospedado en nuestro servidor, para este ejemplo utilizo el IIS instalado en mi maquina, por lo que al abrir el servicio desde un explorador web obtengo la direccion web que nos interesa, esta direccion la copio pues me servira para hacer la referencia de servicio desde mi cliente


Hacemos un cliente para probar el servicio WCF, para hacerlo mas practico no vamos a añadir el cliente en el mismo proyecto donde se ha desarrollado el servicio WCF sino que vamos a abrir Visual Studio y vamos a crear un nuevo proyecto Windows Forms, tal que el diseño quedara de la siguiente manera


Ahora agregamos la referencia al servicio WCF creado utilizando la direccion web http://localhost/EntityEx/WCFEntity.svc 
 

en Address pegamos la direccion que copiamos al ejecutar el servicio WCF hospedado en IIS y como referencia le ponemos BlogService tal como muestro


vamos con el codigo de los eventos click de los botones del cliente, se muestran:


el resultado final con el mensaje se muestra

 



Disclaimer

Hay muchas opiniones sobre Entity Framework y DTO, primero el no utilizar las clases poco generadas por el EF como DTO para ser enviadas al cliente, ya que sobrecargamos y dimensionamos el poder que una simple clase puede tener, la clase generada por el EF debería ser solo eso, una definición utilizada por el EF para acceder a un modelo debidamente normalizado de una bien organizada base de datos y no servir como DTO para los usuarios del servicio, igualmente, no siempre pasa que todos los campos en la entidad del modelo deban ser expuestos al cliente, como sea encontré esta conclusión en un articulo muy interesante del cual dejo el enlace
La conclusión que podemos sacar de todo esto es que el código que ha resultado más fácil de seguir para el resto de los programadores, más mantenible y en consecuencia más simple; ha sido el desacoplado con sus DTOs por un lado y su EF por otro. Tener una buena estructura es programar de forma simple. Si cada objeto hace lo que debe hacer, no es difícil entender una aplicación. Si las clases empiezan a tener más de una responsabilidad, podremos encontrar resultados inesperados cuando hacemos un cambio.
En otras entradas mostrare como realizar este mismo ejercicio pero utilizando WCF Data Service pues si vamos a utilizar las entidades generadas por el Entity Framework que aun es mas rapido y esta "algo" mas aceptado al exponer el modelo de EF al cliente para poder utilizar el poder de las queries REST y en otra entrada mostrare un caso mas real, mas pagano en que se crearan nuestras propias clases DTO y se mapearan utilizando la herramienta Automapper