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 

24 de diciembre de 2014

Separar entidades de negocio desde modelo de Entity framework

Al trabajar con Entity Framework se crean las clases poco en files con extensión .tt, para tener esas clases que representan las entidades de negocio del modelo, se puede...porque hay muchas formas...seguir estos simples pasos

Crear un nuevo proyecto, tipo Solución en blanco


Utilizando el lenguaje C#, agregar dos proyectos a la solución creada, de tipo Librería
de Clases: DAL y Entities y eliminar las clases Class1.cs que crean por defecto





Ahora, agregar un nuevo item al proyecto DAL, sera un 


en la siguiente pantalla escoger desde una base de datos y luego seleccionar la conexión y las tablas, dependerá de cada proyecto las tablas que se vayan a seleccionar para el modelo, así que sin mas suponemos que pueden crear un simple modelo de base de dtos utilizando Entity Framework así que después de todos los pasos que asumo a bien ustedes pueden realizar y la solución quedaría así


Ahora si, debemos dar click derecho en el proyecto DAL y seleccionar Open Folder in File Explorer...  luego buscar y cortar el file Modelo.tt, luego dar click derecho en el proyecto Entities, escoger de nuevo  Open Folder in File Explorer y pegarlo en la carpeta del proyecto Entities tal como muestra la secuencia








Ahora dar doble click en Modelo.tt dentro del proyecto Entitites y modificar el string InputFile de esto:


a esto y salvar cambios:


Ahora en el proyecto DAL, dar click derecho en Modelo.Context.tt y seleccionar Propiedades


Especificar el NameSpace donde se encuentra Modelo.tt


y por ultimo, hacer referencia desde el proyecto DAL al proyecto Entities


y eso es todo, ya tienes separadas alas entidades del negocio de la capa de datos que es donde se encuentra el modelo de Entity Framework para este ejemplo, tu puedes tener tu modelo donde mas te convenga, aqui lo importante es mostrar como hacer la separación de las clases desde el modelo.









23 de diciembre de 2014

CRUD consumiendo un servicio WCF

Toca realizar operaciones a la base de datos en SQL Server desde un servicio WCF, para esto hay dos maneras, ya sea a la antigua con ADO.NET utilizando procedimientos almacenados y los famosos SqlCommand o bien por el lado del ORM Entity Framework.

En esta entrada se utilizaran procedimientos almacenados sobre la siguiente tabla llamada Employee sobre una base de datos a la que llame ejemplo


el web.config del proyecto queda con el Integrated Security = SSPI asi:


Se trabajara sobre el servicio WCF que se creo en entradas anteriores, en este se agregara una carpeta con nombre Clases y dentro de esta agregaremos una clase con el nombre Employee, esta clase sera la entidad de negocio que representara a la tabla Employee, mira el desarrollo del WCF aquí


El código de la clase Employee.cs se muestra a continuación, tener en cuenta los espacios de nombre System.Runtime.Serialization y System.ComponentModel


El procedimiento almacenado que se utilizara se llama IngresarDatos y se agrega sobre la base de datos ejemplo sobre la que también se creo la tabla Employee, el código T-SQL se muestra


Sobre la interfaz o contrato IServicio_WCF del servicio WCF se debe agregar la operación IngresarDatosEmployee, la cual retornara un string y recibe una entidad Employee


El código de la clase Servicio_WCF que implementara la interfaz, desarrollara la operación que se acaba de agregar, el código se muestra


Ahora toca ejecutar el servicio WCF, ya esta debidamente hospedado en el servidor IIS es por eso que se obtiene la dirección web que se resalta en la imagen y la cual debemos copiar pues la necesitaremos a continuación para agregar la referencia de nuestro servicio WCF desde un cliente, para referencia sobre como hospedar un servicio WCF en IIS dejo este enlace


Creamos un nuevo cliente que sera una aplicacion de Windows Forms llamada WindowsFormsApplication1 y agregamos la referencia al servidor WCF, para esto se debe escoger Add Service Reference... desde la aplicación de escritorio


y en la parte de Address pegamos la dirección web que anteriormente habíamos copiado y que hace referencia al servicio WCF creado y presionamos el botón Go


de la imagen anterior, en el Namespace cambie el ServiceReference1 por Servicio, así la manera de invocar al servicio WCF sera Servicio.Servicio_WCFClient test = new Servicio.Servicio_WCFClient();

la pantalla que se mostrara al usuario tendrá el siguiente diseño, para esta entrada solo se codificara el evento del boton Ingresar

El código del evento click del botón Ingresar se muestra a continuación, se hace la referencia al servicio WCF y a la entidad de negocios Employee:


Al completar los datos como se muestra en pantalla y presionar el boton Ingresar aparecerá un MessageBox con un mensaje de confirmación, en caso se de algun error este igualmente se mostrara en el MessageBox, se han hecho las validaciones básicas, ustedes pueden agregar validaciones funcionales para su proyecto.


Para finalizar ejecuto una simple ejecución select sobre la tabla Employee para que muestre el registro que se acaba de ingresar...eso es todo, en la siguiente entrada se mostrara como trabajar WCF con Entity Framework.