sábado, 1 de marzo de 2008

Repository Factory

Cada vez que iniciamos un nuevo proyecto de desarrollo de software que necesite acceder a una base de datos nos hacemos las mismas preguntas, ¿Cómo hacemos la capa de acceso a datos?, ¿Utilizamos un ORM?, ¿Utilizamos datasets?, ¿Utilizamos business entities? Los proyectos tienen necesidades propias que nos deben guiar para escoger una opción dentro de las múltiples opciones que nos ofrece .Net y herramientas libres como NHibernate, generadores de código, etc.

Si eres de los que te gusta o debes utilizar bussines entities y quieres una capa de acceso a datos bien estructurada, y que además utilice el Data Acces Application Block del Enterprise Library el Repository Factory es una excelente opción.

Esta factory inicialmente hacia parte del Web Service Factory(también conocido como Service Factory) como el Data Access Guidance Package, posteriormente P&P saco una nueva versión del Service Factory conocida como el Service Factory Modeling Edition, la cual se enfoca en los servicios web y no en el acceso a datos, excluyendo al Data Access Guidance Package, el cual a su vez se convertiría en el Repository Factory.

Para entender esta factory mostraré un pequeño ejemplo que he realizado.

Repository Factory Sample


Prerequisitos:


- Tener conocimientos en .Net
- Visual Studio 2005
- Sql Server 2005


Descargue los siguientes paquetes e instalelos en el orden que se índica.


1. Guidance Automation Extension(GAX)

2. Guidance Automation Toolkit

3. Repository Factory(DataAccessGuidancePackageSetup.msi)

Pasos a seguir:

1. Base de datos.
2. Esqueleto proyecto.
3. Habilitar Repository Factory en Visual Studio 2005.
4. Asignar responsabilidades a los proyectos.
5. Conexión a la base de datos.
6. Crear CRUD Store Procedures.
7. Crear Business Entities.
8. Crear objetos de acceso a datos.
9. Utilizando la fábrica RepositoryFactory.


1. Base de datos.

Antes de utilizar cualquier generador de código(en esencia el Repository Factory es una generado de código) que se base en el esquema de la base de datos es muy importante tener bien definida la base de datos, ya que después de que se genere el código, normalmente se realizaran cambios sobre este código, lo que hace complicado volver a utilizar la herramienta de generación sobre el código que ya fue generado.Para este ejemplo utilizaremos las tablas del shcema Purchasing de la base de datos AdventureWorks.


Cree una base de datos en Sql Server 2005 con el nombre RepositoryFactorySample(o el que usted desee) y ejecute el siguiente script.

2. Esqueleto del proyecto.

Abra Visual Studio 2005, cree un nuevo proyecto de tipo class library (podría ser también de tipo Windows, Web o Consola) con el nombre RepositoryFactorySample(o el que usted desee), borre el proyecto que se crea por defecto y adicione tres proyectos, dos de tipo class library con los nombres BusinessEntities y DataAccess y cree uno de tipo Windows( o web) con el nombre AppHost.


3. Habilite el Repository Factory en Visual Studio 2005.

Para comenzar a utilizar el Repository Factory ejecute los siguientes pasos:

Vaya al menú Tools y ejecute la opción Guidance Package Manager.

Dé click en Enable/Disable Packages.

Seleccione Repository Factory, dé click en Ok y luego en Close, inmediatamente aparecerá la ventana de Guidance Navigator la cual puede ser cerrada si así lo deseas.


Nota: Si ud no ha instalado ningún otro software factory basado en el GAX sólo verá en el listado el Repository Factory.



4. Asignar responsabilidades a los proyectos.


Para el Repository Factory hay tres tipos de responsabilidad de proyecto:

  • Host Project: Contiene el archivo de configuración(App.config o Web.config) con la cadena de conexión a la base de datos.

  • Bussines Entities Project: Contendrá a los objetos de negocio generados por el Reposiroty Factory.

  • Data Access Project: Contendrá a los objetos de acceso a datos generados por el Reposiroty.

A un proyecto se le puede asignar una, dos o las tres responsabilidades de proyecto, para este ejemplo a cada proyecto se le asignará la responsabilidad correspondiente:

Proyecto->Responsabilidad
AppHost->Host Project
BussinesEntities->Bussines Entities Project
DataAccess->Data Access Project


Para esto por ejemplo siga los siguientes pasos:

Dé click derecho en BussinessEntities y ejecute Repository Factory – Specify Project responsibility.

Seleccione Business Entities Project y dé click en Finish.

Realice los dos pasos anteriores para cada uno de los otros dos proyectos respectivamente.


5. Conexión a la base de datos.


Usted puede crear la cadena de conexión en el archivo de configuración manualmente o lo puede hacer por medio del recipe Add database connection, este recipe es exclusivo del proyecto que tenga la responsabilidad Host Project.


Dé click derecho en AppHost y ejecute Repository Factory – Add database connection.


Dé click en el botón del campo Connection String, inmediatamente aparece una ventana para seleccionar el Data Source, seleccione Microsoft Sql Server, en Data provider seleccione .Net Framework Data Provider SQL Server, dé click en Ok, inmediatamente aparece el cuadro de dialogo Connection Properties ingrese los campos correspondientes para conectarse a la base de datos creada anteriormente, dé click en Ok.


Dé click en Finish.


6. Crear CRUD Store Procedures.

Este recipe permite crear por cada tabla store procedures que cubren el CRUD, dé click derecho en el proyecto DataAccess y ejecute Repository Factory – Create CRUD Store procedures.


En ServiceHost Project seleccione \AppHost, en Connection name seleccione ConnectionDB y dé click en Next.


Un bug, si señores como todo buen producto de software este tampoco está excento de esto, y ni modo de reclamar ya que estos Software Factories son libres y tienen garantía As Is, además son open source, asi que si alguno le quiere dar una mirada al código y de paso resolver este bug, pues bien puede hacerlo descargandose el código aquí. Pero bueno continuemos, selecciona todas las tablas, no selecciones sysdiagrams y dá click en Next.


En este parte vemos que por cada tabla se crearán seis(6) store procedures, uno para insertar un registro, uno para actualizar un registro, otro para eliminar un registro, para obtener todos los registros, para obtener un registro por llave primaria y para obtener registros por las llaves foráneas, y podemos seleccionar solo aquellos que consideremos que necesitemos.

La verdad a mi me parece que en esta parte el Guidance se queda corto, ya que hay mas store procedures que podemos llegar a necesitar, como por ejemplo eliminar registros por cada llave foránea, o obtener registros por cada llave foránea.

Dé click en Next.

Por último debes darle un nombre al archivo donde se guardara el script para la creación de los store procedures, dé click en Finish. Este archivo se creará en el proyecto DataAcces, y antes de ejecutarlo podemos crear los store procedures que nos hagan falta.

Ejecute este script en la base de datos previamente creada.


7. Crear Business Entities.


Este recipe permite crear por cada tabla de la base de datos en un Business Entity, para esto dé click derecho sobre el proyecto BussinesEntities y ejecute Repository Factory – Create business entities from database.
Seleccione en ServiceHost Project AppHost y en Connection name ConnectinoDB, dé click en Next.

Seleccione Tables y dé click en Next. Por favor no seleccione sysdiagrams.

En esta sección pueden cambiar las propiedades (cada propiedad es una columna de la tabla respectiva del Businees Entity) de cada Business Entity a crear.


8. Crear objetos de acceso a datos.

Este recipe creará un conjunto de clases por cada Bussines Entity pero los más importantes a tener en cuenta son la interfaces IEntityRepository y las clases que las implementan.

Seleccione en ServiceHostProject AppHost y en Connection name en ConnectinoDB dé click en Next.

Seleccione en Bussines entities project BussinesEntities y dé click en Next.


Seleccione todos los Entities y dé click en Next.


Por cada Entity se crean por defecto cuatro operaciones, DeleteEntity, GetAllFromEntity, InsertEntity y UpdateEntity, adicionalmente se pueden adicionar otras operaciones como GetOne para obtener un registro por llave primaria, GetMany para obtener varios registros normalmente por llaves foráneas. Para adicionar una operación debe dar click en Add..


Dé click en Finish y en Finish nuevamente, en este mometo el Repository Factory realizará su magia y creará todo la capa de acceso a datos.

Por cada Entity se crea una carpeta de artefactos para acceder a la tabla correspondiente a la base de datos. La clases más importante es la EntityRepository la cual implementa la Interface IEntityRepository, una de ellas es por ejemplo la ProductVendorRepository la cual implemente IProductVendorRespository, esta es la clase que contiene todos los métodos CRUD para la Tabla/Entity.

Abra en VS2005 el App.Config del proyecto AppHost y mire que adicional a las clase que se han generado, en el archivo de configuración se ha creado una sección RepositoryFactory la cual contiene a su vez la sección repositories donde se especifica cada par IEntityRepository/EntityRepository.



9. Utilizando la fábrica RepositoryFactory.

Por ultimo al proyecto del AppHost adicionaremos referencia a los proyectos BussinesEntities y DataAccess y a la dll de Microsoft.Practices.Repository que se encuentra en "C:\Program Files\Microsoft patterns & practices\Data Access Guidance Package Setup\Microsoft.Practices.Repository.dll" y agruegue el siguiente código a la forma.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using BussinesEntities;
using DataAccess;
using Microsoft.Practices.Repository;

namespace AppHost
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Vendor vendor = new Vendor();

vendor.AccountNumber = 1;
vendor.ActiveFlag = false;
vendor.CreditRating = 10;
vendor.ModifiedDate = DateTime.Now;
vendor.Name = "Vendedor1";
vendor.PreferredVendorStatus = false;
vendor.PurchasingWebServiceURL ="http//ehudesgarcia.blogspot.com";

IVendorRepository repository = RepositoryFactory.Create<IVendorRepository>("ConnectionDB");

repository.Add(vendor);
}
}
}
Happy Coding

4 comentarios:

Unknown dijo...

Me gusta el wizzard online... Pero para aquellos que vivimos en la ignorancia al respecto de estos temas, sería interesante ver al final un link hacia alguna parte donde uno lo vea en funcionamiento, o algunos pantallazos de la versión final. Felicitaciones! Gran esfuerzo!

Unknown dijo...

Muy Buen Aporte . ;)

ccuenca dijo...

Muy buen aporte compañero caleño!!!!! una pregunta, como se integra todo esto con lo nuevo del Framework 3.5 (Linq to SQL || Linq To Entities), Patterns & Practices van a dar soporte al VS 2008??

Saludos!!

Unknown dijo...

Excelente aporte, muchas gracias me fue de mucha utilidad.