miércoles, 26 de octubre de 2011

Aplicación en MVC 3 por capas con MySQL

En el siguiente ejemplo se desarrollará por capas y se aplicanran patrones de desarrollos como el Repositorio, Inyección de Dependencias, todo esto para presentar información, contenida en un motor MySql, en un website que estará  sobre  MVC 3. En este aplicativo el repositorio empleará Code Firts y ademas se manejaran las interfaces para proporcionar una capa de servicios al sitio web.

Para ver una versión mejorada de este post ingresa a mi otro blog

Configurando la solución

  1. Visual Studio en Blanco llamada MyApp.
  2. Sobre la solución creada agregaremos tres librerías de clases llamadas así:
    • MyApp.Dominio : Esta librería se encuentran las clases que define el dominio de la aplicación.
    • MyApp.Infraestructura : Esta librería se crearan las clases necesarias para acceder a la DB, para ello emplearemos el patrón Repositorio y consumiremos la librería MyApp.Dominio.
    • MyApp.Servicio : Esta librería se crearán las clases que serán utilizadas por el website para manipular la validación de las entradas y servirá como puente entre MyApp.Infraestructura y MyApp.WebSite.
    • MyApp.WebSite: Sitio web en MVC 3 en el que se visualizará la información.
La solución creada se verá así luego de eliminar las clases por defecto generadas por el IDE


Estructura de la solución MyApp


Configurando la Librería MyApp.Dominio
Agregamos las siguientes referencias al proyecto

  • System.ComponentModel.DataAnnotations
  • EntityFramework 

Ahora creamos una clases Pais.cs que contendrá dos campos con sus respetivos get y set. Sobre cada uno de estos campos se han agregado metadatos que harán que al compilador genere la correspondiente  la DB con las entidades y con sus respectivos tipos de datos y longitudes. Estos metadatos también será consumidos por el website para validar la entrada de información.


Clase Pais con los ensamblados referenciados en MyApp.Dominio

En este punto se hará un pequeño adelanto, se  agregará la cadena de conexión en el Web.Config de MyApp.Website. la cadena de conexión sera la siguiente:
Cadena de conexión de la aplicación con MySql
Este ultimo paso es necesario para poder crear le contexto para el acceso a los datos, recuerden que el nombre de la conexión agregada debe ser exacto al de la clase a agregar en MyApp.Infraestructura de lo contrario no funcionará.

Configurando la librería MyApp.Infraestructura
Agregamos las siguientes referencias al proyecto
  • EntityFramework 
  • System.Data.Entity
  • MyApp.Dominio (Librería que contiene la definición de la entidad País)
Luego definimos la interfaz de repositorio de País

Definición de la interfaz para el repositorio País

Definimos el contexto de la aplicación y la implementación para el respositorio Pais

Definición de la clases SigEntidades.cs
Implementación para el repositorio País

Configurando la librería MyApp.Servicio
Agregamos las siguientes referencias al proyecto
  • MyApp.Dominio (Librería que contiene la definición de la entidad País)
  • MyApp.Infraestructura (Librería que contiene el repositorio Pa)
  • System.Web.Mvc (Version 3.0)
Se crea la interfaz del servicio IPaisServicio.cs

Interfaz del servicio IPaisServicio.cs
Agregando la implementación de PaisServicio, de esta manera logramos desacoplar el acceso a datos de la aplicación. Si queren mayor detalle remitanse a http://www.asp.net/mvc/tutorials/iteration-4-make-the-application-loosely-coupled-cs .

Implementación de la clase PaisServicio

Adicionalmente se creará una interfaz IValidationDictionary.cs y su respectiva implementación ModelStateWrapper.cs. Estas dos clases permitiran realizar validaciones al modelo pero ello solo se limitara a realizar un validación considerando que es una aplicación web en MCV 3, si el escenario cambiase a una aplicación de escritorio habría que ajustar la implementación de esta validación.

Interfaz IValidationDictionary.cs

Implementacion de la clase IValidationDictionary.cs en ModelStateWrapper.cs


Configurando la aplicación MyApp.WebSite
Agregamos las siguientes referencias al proyecto
  • MyApp.Dominio (Librería que contiene la definición de la entidad País)
  • MyApp.Servicio (Librería que contienen el servicio)
Creamos el controlador PaisController, este será el encargado de interactuar entre vista y servicio el cual contiene a su vez el modelo. Dando clic derechos sobre la carpeta Controllers > Agregar > Controlador, se obtiene la siguiente ilustración.

Creación del controlador  para País
Se realiza la implementación del servicio en el controlador y se emplea el patron de Inyección de dependencias. Este patrón básicamente consiste en transferir a la clase los objetos que debe usar pero que sin que sea el controlador que los instancie.

Ya tenemos la infraestructura, el controlador ahora falta la vista, para ello damos clic derecho sobre la vista Index, tal como aparece en la grafica para agregar la vista para Index en la que se presentará el listado de Paises.
Controlador Pais con su implementacion de CRUD
Agregamos vista Index para el controlador de Paises
La vista que se agregará sera tipada y la plantilla sera de tipo List para que se genere de manera automática la visualización de los datos en una tabla.

Definiendo la vista Index para Paises

Con el anterior paso se creará la vista Index dentro de la ruta  /View/Pais/Index.cshtml

Vista generada con la plantilla List para Paises
Para finalizar, ejecutamos la aplicación el resultado será

Ejecución de la vista Index para Paises
De manera similar se crean las vistas para editar, eliminar, detalles, registrar solo basta con cambiar las plantillas en cada vista a Edit, Delete, Details, Create. 

En siguiente entradas se agregaran entidades relacionadas, búsquedas y uso de componentes como WebGrid entre otros.

Aquí les dejo el proyecto  http://www.mediafire.com/?6zvej7zg6vac2uc con los CRUD totalmente implementados.