Ticker

6/recent/ticker-posts

Conexión a datos WCF - Fase II

En el siguiente apartado pretendo implementar y demostrar que tipos de proyectos hay que agregar a nuestra solución para poder desarrollar servicios WCF y luego consumirlos desde una aplicación MVC que implementaré en la fase IV, ya que en la fase III publicaremos nuestro servicios en el IIS.

Los requisitos por ahora para este apartado son:
  • IDE – Visual Studio 2010.
  • SQL Sever 2008.
  • EnterpriseLibrary.
Antes de iniciar con la implementación, comenzaré con la identificación y creación de los tipos de proyectos que utilizaré.

En nuestra solución agregaré 2 proyectos de tipo biblioteca de clases y 2 de WCF una de biblioteca o clases de servicios WCF y otra de aplicación de servicios WCF, así como existe biblioteca de clases comunes o genéricas (las 2 primeras mencionadas) por así mencionarlos, son las  que más se suele usar al desarrollar proyectos en 3 o N capas o dependiendo de las necesidades del desarrollo, también existe para WCF con la diferencia que son para servicios, en lo cual te adiciona un archivo de configuración (App.config se adiciona de manera automática al crear el proyecto - biblioteca de clases de servicios WCF), entre otros detalles que describiré más adelante.


Para continuar adicionaremos los proyectos a nuestra solución, luego describiré las utilidades de cada uno de ellos:

Comencemos adicionando 2 proyecto de clases con nombre PyBusiness y PyEntity.


Ahora adicionamos el primer proyecto de tipo WCF que será el de biblioteca de servicios WCF con nombre PyWcfServiceLibrary.

Y por último adicionamos el segundo proyecto de tipo WCF que será el de aplicación de servicios WCF con nombre PyWcfService.

Una de las recomendaciones para poder identificar el tipo de proyecto son en las imágenes y recuadros seleccionados de color verte.

La estructura de los proyectos que acabamos de crear va quedando de esta siguiente manera (ver imagen)

Las carpetas BackEnd y FrontEnd son consideraciones de buenas prácticas al implementar una solución web, puede leer siguiente articulo.

Utilidades de los proyectos adicionados a la solución:
En los proyectos PyBusiness y PyEntity quizás no hay mucho por mencionar. Son muy usados casi en todo desarrollo de 3 a más capas.

PyBusiness en este caso almacenará una clase para nuestra conexión a datos y las demás clases serán para crear los métodos o funciones entre otros concernientes a la lógica del negocio que estemos desarrollando dicho proyecto.

PyEntity se encarga de almacenar las propiedades de nuestra entidades que son parte de la lógica del negocio.

PyWcfServiceLibrary proyecto de biblioteca de servicios que se encarga de incluye automáticamente los tres archivos siguientes:
  1. Archivo de contrato de servicio (IService1.cs).  Es una interfaz a la que se aplican los atributos de servicio WCF. Este archivo proporciona una definición de un servicio simple que muestra cómo definir los servicios, e incluye operaciones basadas en parámetros y un ejemplo de contrato de datos simple. Éste es el archivo predeterminado mostrado en el editor de código después de crear un proyecto de servicio WCF.
  2. Archivo de implementación de servicio (Service1.cs). Implementa el contrato definido en el archivo de contrato de servicio.
  3. Archivo de configuración de la aplicación (App.config). Poporciona los elementos básicos de un modelo de servicio WCF con un enlace HTTP seguro. Además incluye un extremo para el servicio y habilita el intercambio de metadatos.
PyWcfService proyecto de servicio de aplicación web, el encargado de ser parte de conformar la referencia de los demás proyecto, ya que este proyecto será el que publicaremos en nuestro ISS (aquí se encontraran los servicios que publicaremos). Además, incluye los tres archivos siguientes que luego iremos modificando:
  1. Archivo de host del servicio (Service1.svc).
  2. Archivo de contrato de servicio (IService1.cs).
  3. Archivo de configuración web (Web.config).
El contexto para la implementación será listar los registro de una tabla:

Consideración es para implementación:
Para este caso determinare 2 grupos el GRUPO A de las clases genéricas que casi siempre se implementa en un proyecto de 3 a N capas, y el GRUBO B que básicamente será para la implementación de nuestro servicios (la gran parte es hacer referencia a los métodos creados e ir )

EN EL GRUPO A:
  1. Crear la cadena de conexión
  2. Crear el método de la lógica de negocio (por ahora sólo usaremos un simple select)
  3. Crear nuestra entidad equivalente a la sentencia select
EN EL GRUPO B:
  1. Hacer referencia método creado que se realiza el GRUPO A.
  2. Luego se implementa la referencia del método o según otros contexto es hacer una copia al método creado que gracias a la Serialization se puede realizar la comunicación remota a pasar objetos por valor de un dominio de aplicación a otro.
Recordemos que la publicación de nuestro servicio será a través de la aplicación PyWcfService. Iniciare la implementación haciendo énfasis a las librerías a usar y a la cadena de conexión

En este caso haremos uso de Enterprise Library Versión 5.0.414.0. En el App.config del proyecto PyWcfServiceLibrary implementamos las siguiente líneas (haremos referencia a las librerías de Enterprise Library y la cadena de conexión)

  
    
Además debemos adicionar las librería del Enterprise Library en el proyecto PyWcfServiceLibrary  y los mismo haremos para el proyecto PyBusiness (no debemos confundir con adicionar e importar).

Ahora implementaremos en el proyecto PyEntity todo los dataMember que es hacer referencia a los nombres de las columnas de nuestra entidad (tabla), en mi caso solo quiero visualizar 2 de ellas. Además debemos importar la librería using System.Runtime.Serialization.
using System.Runtime.Serialization;//Importar la referencia

namespace PyEntity
{
    [DataContract]//Adicionamos el contrato de datos
    public class ClsDepartamentoEN
    {
        //Adicionamos los DataMember (columnas de uestra entidad Departamento)
        [DataMember(Name = "COD_DEPARTAMENTO")]
        public string COD_DEPARTAMENTO { get; set; }

        [DataMember(Name = "DES_DEPARTAMENTO")]
        public string DES_DEPARTAMENTO { get; set; }
    }
}
Siguiendo con la implementación:
Implementaremos en el proyecto PyBusiness nuestro método que nos devolverá la data según nuestro sentencia select.
  1. Adicionar una clase (en mi caso ClsDepartamentoBL.cs)
  2. Ahora si importamos las librerías necesarias y el proyecto PyEntity en la clase creado y creamos nuestro método GetDepartamentoList.
using PyEntity;//Hacemos referencia al proyecto donde estan los datamember del contrato de datos 
using System.Data;//Importamos el System.Data
using System.Data.SqlClient;//Importamos el provedor SqlClient para el acceso a datos

//Importamos la librería de Enterprise Library
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Data.Sql;
using Microsoft.Practices.EnterpriseLibrary.Common;

namespace PyBusiness
{
    /* Modificamos la clase a publica */
    public class ClsDepartamentoBL
    {   
        /* Query Listar todos los departamentos */
        public static List GetDepartamentoList()
        {
            Database database = DatabaseFactory.CreateDatabase();
            //Database database = new DatabaseProviderFactory().Create("Cnx");
            string StrQuery = string.Format("SELECT COD_DEPARTAMENTO, " +
                                             "          DES_DEPARTAMENTO " +
                                             "FROM UBI_DEPARTAMENTO");

            SqlCommand cmd = (SqlCommand)(database.GetSqlStringCommand(StrQuery));

            IDataReader reader = database.ExecuteReader(cmd);
            return ClsEntityCreator.CreateDepartamentoList(reader);
        }
    }
}
Ahora regresamos a nuestro proyecto PyWcfServiceLibrary e implementamos el metodo GetDepartamentoList en la clase IService1 para luego hacer referencia e implementar en la clase Service1

Clase IService1

//Importamos los proyectos de las entidades y del negocio
using PyEntity;
using PyBusiness;

namespace PyWcfServiceLibrary
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
    [ServiceContract]
    public interface IService1
    {
        //Ahora implementamos el método GetDepartamentoList
        [OperationContract]
        List GetDepartamentoDataList();
    }
}

Calase Service1

//Importamos los proyectos de las entidades y del negocio
using PyEntity;
using PyBusiness;

namespace PyWcfServiceLibrary
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in both code and config file together.
    public class Service1 : IService1
    {

        //Ahora invocamos el método creado en el proyecto PyBusiness
        public List GetDepartamentoDataList()
        {
            return ClsDepartamentoBL.GetDepartamentoList();
        }
    }
}
En otros palabras acabamos de crear un servicio llamado IService1 que esta conformado con un método llamado GetDepartamentoDataList()

Para finalizar en el proyecto PyWcfService hacemos referencia a nuestro servicio que acabamos de crear y luego testeamos nuestro servicio creado

<%@ ServiceHost Language="C#" Debug="true" Service="PyWcfServiceLibrary.Service1" CodeBehind="PyWcfServiceLibrary.Service1.cs" %>


Testeamos nuestro servicio con la herramienta que nos proporciona el proyecto PyWcfService que es de aplicación de servicios WCF.


Proyecto en C#

Nos vemos en la siguiente fase que veremos sobre la publicación del servicio que acabamos de crear.

Publicar un comentario

2 Comentarios

  1. Es un gran aporte , como siempre bien explicado.
    Saludos y muchas Gracias.

    ResponderBorrar
  2. Eso espero mi estimado que la explicación sea lo necesario para ir aprendiendo acerca de servicios, ya que es un tema amplio... Saludos para ti también

    ResponderBorrar