Mostrando entradas con la etiqueta N Capas. Mostrar todas las entradas
Mostrando entradas con la etiqueta N Capas. Mostrar todas las entradas

viernes, 25 de marzo de 2016

Arquitectura de N Capas: Parte 3 – La Capa de Entidades

Arquitectura de N Capas: Parte 3 – La Capa de Entidades
Ahora que tenemos el proyecto armado y la capa acceso a datos y la de entidades, vamos a separar las entidades que se encuentran dentro del modelo de datos den Entity Framework y colocarlos en un proyecto aparte.
Cuando en la capa de datos creamos el modelo de datos, éste se creó de la siguiente manera:
  • ModelGestion.edmx
  • ModelGestion.Context.cs
  • ModelGestion.Designer.cs
  • ModelGestion.edmx.diagram
  • ModelGestion.tt

Para separar las entidades, trasladamos el archivo ModelGestion.tt de la capa de datos a la capa de entidades, para esto seguimos los siguientes pasos:

  1. Cerrar las ventanas dentro del Visual Studio.
  2. Abrir el explorador de Windows.
  3. Ir a la carpeta de Datos.
  4. Mover el archivo ModelGestion.tt a la carpeta Entidades.
  5. Volver a Visual Studio a la capa de entidades.
  6. Utilizar la opción Show All Files en la capa de presentación para ver el archivo de ModelGestion.tt en la ventana Solution Explorer.
  7. Integrarlo al proyecto mediante la opción de clic derecho Include in Projet .
  8. Abrir el archivo ModelGestion.tt.
  9. Redireccionar, donde está el modelo de datos, de la siguiente manera: conststringinputFile = @"../Datos/ModelGestion.edmx". Lo anterior se hace porque no podemos crearlo mediante: adicionar referencias al proyecto.
  10. Volver a la capa de acceso a datos y eliminar el link roto del archivo ModelGestion.tt .
  11. En el nombre del proyecto de Datos usar clic derecho para incluir la referencia al proyecto Entidades.
  12. Ir a las propiedades del archivo ModelGestion.Context.cs.
  13. En la opción CustomToolNamespace escribir el nombre de la capa de Entidades.
  14. Incluir en la clase de acceso a datos el llamado a Entidades:  using Entidades.
  15. Recompilar la solución.



Las imágenes de los pasos las podrás ver en la Ilustración 1:

Ilustración 1


Ahora que tenemos la capa de entidades agreguemos en ella los metadatos a la entidad Procesos, siguiendo los siguientes pasos:
  1. Agregar al proyecto la referencia a System.ComponentModel.DataAnnotations.
  2. Crear una clase ProcesosMD.cs.
  3. Incluir en la clase:usingSystem.ComponentModel.DataAnnotations.
  4. Volver pública la clase publicclassProcesosMD .
  5. Copiar los atributos de la clase ModelGestion  / Procesos dentro de ProcesosMD .
  6. Adicionar los metadatos.
  7. Al finalizar con la clase ProcesosMD, extendemos las propiedades de la clase

La clase con los metadatos termina así:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;

namespace Entidades
{
    public class ProcesosMD
    {
        [Display(Name = "Id")]
        public int IdProceso { get; set; }

        [Display(Name = "Nombre Proceso")]
        [Required(ErrorMessage = "Campo requerido")]
        public string NombreProceso { get; set; }

        [Display(Name = "Versión")]
        [Required(ErrorMessage = "Campo requerido")]
        public string Version { get; set; }

        [Display(Name = "Fecha de Creación")]
        [Required(ErrorMessage = "Campo requerido")]
        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")] //Formato de la fecha
        public System.DateTime FechaCreacion { get; set; }
    }

    [MetadataType(typeof(ProcesosMD))]
    public partial class Procesos
    {
    }
}

Algunos de los metadatos que me han sido útiles los puedes encontrar a continuación:
[DisplayName("Nombre del atributo")]
[Required(ErrorMessage = "Campo requerido")]
[MaxLength(50, ErrorMessage = "Máximo 50 caracteres")]
[StringLength(50, ErrorMessage = "Máximo 50 caracteres")]
[RegularExpression(@"[a-zA-ZñÑ\s]{2,50}", ErrorMessage = "Solo letras")]
[RegularExpression("^[0-9]*$", ErrorMessage = "Solo números")]
[Range(0, 999, ErrorMessage = "Máximo tres números")]
[Range(1000000000, 9999999999, ErrorMessage = "10 números")]
[DataType(DataType.Date)] //Fecha
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")] //Formato de la fecha
[DataType(DataType.Url)]
[DataType(DataType.EmailAddress)]


Aquí finalizamos el ejemplo de la capa de Entidades, la cual nos facilita el transporte de los datos entre las demás capas del modelo; recuerden agregar los metadatos a todas las entidades que lo necesite. Así mismo, es mejor hacerlo en archivos separados que agregarlos a la entidad, por la sencilla razón que si hay que cambiar el modelo de datos agregando una propiedad adicional que casi nunca ocurre (Broma), no perderíamos el trabajo elaborado.
Para finalizar les recuerdo:
  • Cada quien tiene su manera de matar pulgas, así que puede haber una gran cantidad de maneras de hacer el mismo trabajo.
  • Estos artículos son ejemplos, así que, si tienes una mejor manera de hacerlo o puedes colaborarme con alguna observación, tu comentario es bienvenido.
  • No asumo ninguna responsabilidad por el uso de lo expuesto.
  • Si los artículos te son de utilidad, no olvides un “Me Gusta” o dejar algún comentario.

martes, 22 de marzo de 2016

Arquitectura de N Capas: Parte 1 – La base de datos


Este artículo es el primero de una serie de artículos en que quiero explicar mi visión de la programación por capas.

Ilustración 1
Siendo la programación en capas una arquitectura que tiene como objetivo principal separar la capa de diseño de la de lógica, existen otros valores adicionales que aportan a proyectos grandes entre otros como: el crear un código más estructurado, facilita el trabajo en equipo, permitiendo que varios programadores trabajen paralelamente en una misma funcionalidad sin interferirse mutuamente. También se puede separar algunas de las capas de código en diferentes servidores para balanceo de cargas, buses de datos empresariales, etc.

En la ilustración 1 podrás apreciar el un modelo básico de capas.

A continuación, describiré las herramientas que usaré para elaborar el ejemplo en sus diferentes capas:
  • La base de datos se elabora en SQL Server Express 2014.
  • La capa de acceso a datos la desarrollaré en C#, Entity Framework y Linq.
  • En la capa de entidades separaré la definición de las entidades del Entity Framework y agregaré metadatatos a los atributos.
  • La capa de lógica en C#, como su nombre lo indica, colocaremos la lógica de la aplicación y uso de try/catch.
  • En la capa de presentación usaré MVC, Bootstrap y JQuery.


Empecemos:

Las tablas ejemplo para la base de datos, representan un modelo relacional para almacenar los datos de procesos, procedimientos y diagramas de notación BPMN, los objetos del diagrama como son los eventos, actividades, compuertas y las conexiones entre estos objetos. Uso este ejemplo porque con él se puede representar la mayoría de las estructuras de datos como son: maestro detalle, árboles y grafos. Además, me interesa este tipo de modelos para ampliar el tema con otros artículos más adelante.

Creando la Base de Datos

Comencemos ingresando a SQL Management Studio 2014, después nos ubicamos en el explorador de objetos y en la opción de base de datos pulsamos clic derecho y usamos la opción nueva base de datos, como se ve en la ilustración 2.


Ilustración 2



Una vez seleccionamos la opción de base de datos, el SQL Management Studio 2014 abre una ventana de creación de base de datos, en esta opción debemos darle el nombre a una base de datos y un propietario. Para el Nombre de la base de datos usaremos “Procesos” y el propietario de la base de datos será: “sa”.


Creación del esquema

Una vez creada la base de datos, desplegamos el árbol de la base de datos y nos vamos a seguridad, en seguridad ubicamos el puntero del mouse sobre Esquemas y pulsamos clic derecho y creamos un nuevo esquema. Para el nombre del esquema usaremos “Aplicacion” y Propietario del esquema “dbo”.
Ilustración 3




Creación de las Tablas

Para la creación de las tablas se pulsa clic derecho sobre la opción de la tabla y clic en la opción Tabla, al crear la tabla, no olvidar crear la llave, a la llave volverla un auto numérico “Especificación de identidad” y cambiar el esquema donde vamos a crear la tabla en la Ventana de propiedades, que accedes mediante la tecla rápida F4 o en el menú de ver. En la ilustración 3 se puede apreciar la creación de la tabla procesos.


Ilustración 4


Las tablas del ejemplo quedan así:
·         Procesos: Guarda los procesos de una empresa
·         Procedimientos: Guarda los procedimientos asociados a un proceso.
·         Objetos: Almacena los objetos del procedimiento (Sendas, Eventos, Actividades, Compuertas)
·         Tipos de objetos: Categoriza los objetos de los procedimientos
·         Conexiones; Define los caminos entre los objetos de un procedimiento (Actividades, Compuertas, Eventos).
·         Existe una relación recursiva en la tabla objetos entre los campos IdObjeto y FK_Objeto

Creación de las relaciones

Sigue los pasos que se usaron para crear la tabla procesos en la creación de las otras tablas y una vez estén creadas, procedemos a crear las relaciones entre ellas, esto lo hacemos por la opción de Diagrama en la Base de datos y creamos un nuevo diagrama, en este agregamos todas las tablas, las organizamos y arrastramos la llave primaria a la llave foránea para establecer la relación. Por ejemplo: Arrastramos “Drag and Drop” entre la llave primaria de Procesos “IdProceso” y el campo “IdProceso” en la tabla procedimiento. En la ilustración 5 se puede ver los primeros pasos para la elaboración del diagrama de la base de datos.
Ilustración 5



En la ilustración 6 se ve el modelo del ejemplo ya terminado.

Ilustración 6

Algunos datos de las tablas:
  • Todas las tablas del modelo tienen una llave subrogada o identificador único.
  • Todas las llaves subrogadas son campos enteros.
  • En la tabla de procesos deje un campo Date para posteriormente agregarle metadatos y reglas de validación en la capa de entidades.
  • La relación entre las tablas “Procedimientos y Objetos” y “Objetos y Conexiones” tienen la opción de borrado en cascada activado.
  • Todavía no hay procedimientos almacenados, más adelante haré un ejemplo.
  • Existe una relación recursiva entre IdObjeto y FKObjeto.
  • La relación recursiva de Objetos, representa un árbol.
  • La relación doble Objetos y Conexiones representa un grafo.



El Script para la creación del BD lo puedes descargar aquí.
Si prefieres un backup de la base de datos, se puede descargar aquí.

Arquitectura de N Capas: Parte 2 – La Capa de Acceso a Datos

Para finalizar les recuerdo:

  • Cada quien tiene su manera de matar pulgas, así que puede haber una gran cantidad de maneras de hacer el mismo trabajo. 
  • Esto es un ejemplos, así que, si tienes alguna observación, para mejorar el artículo, será bienvenida. 
  • No asumo ninguna responsabilidad por el uso de lo aquí expuesto. 
  • No olvides dejar un comentario.

Entrada destacada

Arquitectura de N-Capas con Visual Studio .NET y AngularJS

Este artículo es el primero de una serie de artículos en que quiero explicar mi visión de la programación por capas. La Arquitectura ...