Introducción al desarrollo en ASP.NET MVC

Aproximación a una arquitectura empresarial

https://github.com/jsartegain/CursoASPMVC1/

1. Introducción

Qué es MVC

  • MVC patrón arquitectural. Significa Model View Controller (Modelo Vista Controlador)
  • Propuesto en los años 70. Madurez.
  • Componentes
    • Modelo: Lógica de negocio
    • Vista: Presenta la información
    • Controlador: Gestiona flujo información entre la vista y el modelo
  • La lógica del modelo y del controlador están desacopladas de la vista

MVC: Separación de cometidos

  • Bajo acoplamiento: Los componentes del software deben ser lo más independientes posible
  • Inyección de dependencias: La clase recibe un objeto, no lo crea. 
  • IoC: Inversión de control en el flujo de creación de objetos
  • Unity: Contenedor de inyección de dependencias

Arquitectura propuesta

Capa de persistencia de datos

  • Patrón data-mapper
  • ORM: Object-Relational Mapping
  • Mapeo del modelo relacional a Objetos
  • Entity framework
  • Patrón Repositorio: Provee un interfaz para el acceso a la capa de mapeo de datos como si fuese una colección en memoria
  • El contrato del repositorio pertenece a la capa de dominio, la implementación a la capa de persistencia de datos. 
  • Patrón Unit of Work

Capa de dominio

  • Contiene las clases del modelo de dominio y la lógica de negocio asociada a dicho dominio
  • Dominio anémico, sólo presenta las clases definidas sin ningún comportamiento
  • Contiene el contrato del repositorio
  • Esta capa debe estar totalmente aislada del resto de capas, sin ninguna dependencia. El dominio debe ser "portable"
  • Servicios de dominio: coordina lógica de negocio
  • Algunos patrones de la capa de dominio:
    • Entities, Value Objects, Services, Aggregates, Repositories

Capa de aplicación

  • Es, en realidad, una capa de servicio con acceso a los servicios de dominio, a los repositorios, unit of works
  • Esta es la única capa accesible por cualquier cliente que quiera consumir la aplicación
  • No contiene lógica de negocio
  • Aspectos técnicos: Conversión de formatos de datos, etc.
  • Adaptadores/Conversores: DTOs
  • Capa fachada (Facade layer) para el consumidor

Capa de presentación

  • Presenta la interfaz de usuario
  • En nuestro caso será una capa en tecnología web basada en el patrón MVC
  • Diseño gráfico, usabilidad, programación frontend
  • ASP.NET MVC, Motor de vistas "Razor", HTML, javascript (jQuery), AJAX, etc.
  • Controladores, Automapper
  • Inyeccción de dependencias, IoC, Unity

El modelo basado en el dominio

  • DDD (Domain Driven Design) o diseño dirigido por el dominio es un conjunto de buenas prácticas y patrones para construir software sólido a partir de la construcción del dominio.
  • Es conceptual
  • Independiente de la tecnología
  • Conjunto de clases y objetos interrelacionados que conforman el "negocio"
  • Lenguaje ubicuo

Patrones de dominio

Los patrones principales del modelo del dominio:

  • Entity: Es un objeto con identidad propia y único en el sistema. Ej.: Clientes, Proveedores, Facturas
  • Value Object: No tiene identidad. Ej: Estado, tipo 
  • Aggregate: Conjunto de objetos que conforman una unidad lógica. Sólo accesibles mediante el "Aggregate Root".
  • Service: Expone operaciones a las otras capas de la aplicación.
  • Repository: Servicio de acceso a los datos - objetos de cada "Aggregate Root". No es una capa de acceso a datos.

2. Desarrollo en ASP.NET MVC

Qué es ASP.NET MVC

  • Es un entorno de código abierto
  • Basado en el .NET framework de Microsoft
  • Pensado para construir aplicaciones web en las que se facilita la separación del código
  • Es totalmente extensible y personalizable
  • Desarrollado y mantenido por Microsoft

ASP.NET MVC frente a Webforms

  • Separación de cometidos
  • Mantenimiento más fácil
  • Extensible y personalizable
  • No utiliza ViewState
  • Enrutamiento URL

ASP.NET MVC pipeline

  1. Routing
  2. Controller initialization
  3. Action execution
  4. Result execution
    1. View Initialization and rendering

Routing en ASP.NET MVC

Sistema de comparación de patrones que monitoriza las peticiones entrantes y "presupone" que hacer con dicha petición.

Utiliza la tabla de rutas para comparar con las peticiones entrantes.

La tabla de rutas es totalmente personalizable.

Dos formas de registrar rutas: 

  • Rutas basadas en convención: Registradas al inicio
  • Rutas de atributo: Registradas en el controlador

View

Motor de vistas:

  • Subsistema de MVC con su propia sintaxis de marcado
  • Convierte la plantilla de servidor en HTML y lo renderiza para el navegador cliente
  • Dos motores "preinstalados": webforms, razor
  • Existen más motores disponibles
  • Podemos crear nuestro propio motor

View: Webform engine

  • Utiliza la extensión de archivo .aspx
  • Tiene la misma sintaxis que los webform tradicionales
  • Utiliza etiquetas de inicio y fin <% %>
  • No previene ataques XSS. Los scripts o códigos HTML peligrosos no se cifran. 
  • Soporta la vista diseño en Visual Studio

View: Razor engine

  • Utiliza la extensión de archivo .cshtml (C#) or .vbhtml (VB)
  • Nuevo sintaxis más compacta
  • Previene los ataque XSS. Cifra los scripts y HTML peligrosos antes de "renderizarlos" para la vista
  • No soporta la vista diseño en Visual Studio

View: Helpers

Métodos que encapsulan funciones de salida para las vistas

  • Html Helpers: Producen cadenas HTML (@Html.)
    • Inline Html helpers: Sólo para la vista actual
    • Built-in Html Helpers: Standard, tipados, plantilla
    • Custom Html Helpers
  • URL Helpers: Producen enlaces (@Url.) 
  • AJAX Helpers: Producen elementos ajax (enlaces, forms) (@Ajax.)
  • Security: AntiForgeryToken
  • Validation: ValidationSummary, ValidationMessageFor

View: Elementos razor

  • Layout (shared page): Elemento contenedor de vistas. Master Page en webform.
  • Section: Define contenido de una sección a mostrar en la "shared page"
  • RenderSection: Renderiza el contenido de la sección definido en la vista "hija"
  • RenderBody: Renderiza el contenido "global" de la vista "hija".
  • ViewStart: Asigna el mismo layout a un grupo de vistas
  • Partial View: Segmento de vista reusable

Controller: Acciones y resultados

Devolución y renderizado de vistas

  • return View(): Genera el HTML para la vista y lo envía al navegador.  
  • return RedirectToAction(): Provoca una redirección a otra acción del controlador.
  • return Redirect(): Provoca una redirección a otra URL.
  • return PartialView(): Envía un segmento de HTML y lo envía al navegador

Controller: Acciones y resultados

Tipos devueltos por las acciones

  • ViewResult: Tipo devuelto por "return View()" que renderiza la vista
  • PartialViewResult: Devuelto por "return PartialView()" renderiza la vista parcial
  • RedirectResult: Provoca una redirección HTTP de códido 301
  • JsonResult: Serializa un objeto en formato JSON

Controller: paso de datos a la vista

  • ViewData: Duración petición actual, nulo si hay redirección, requiere "type casting"
  • ViewBag: Dinámico, duración petición actual, nulo si hay redirección, no requiere "type casting"
  • TempData: Duración sólo redirección dentro del controlador, requiere "type casting", tras cargarse la vista se elimina.
  • Session: Duración configurable, requiere "type casting"
  • Vista tipada: Model, ViewModel
  • Serialización del ViewModel mediante javascript.

Controller: Atributos y filtros

Inyectan código antes de que se ejecute una acción.

Los filtros son atributos que, normalmente, se aplican a una acción de un controlador o a un controlador entero.

  • [HttpGet]: Restringe la petición a una acción del controlador al método HTTP GET.
  • [HttpPost]: Restringe la petición a una acción del controlador al método HTTP POST.
  • [Authorize]: Restringe el acceso a usuarios autenticados.
  • [OutputCache ]: Cachea la salida de una acción del controlador
  • [ValidateAntiForgeryToken]: Previene el secuestro de una solicitud. Prevención contra ataques XSRF/CSRF

Controller: Tipos de filtro

Habitualmente se utilizan para las siguientes tareas:

Autenticación y/o Autorización personalizadas, manejo de errores, Logging, Cacheo de datos...

  • Authentication Filters: Autenticación personalizada
  • Authorization Filters: Autorización personalizada
  • Action Filters: Se ejecutan antes o después de la acción del controlador
  • Result Filters: Se ejecutan antes o después de la generación del resultado de la acción.
  • Exception Filters: Se ejecutan en el momento que se produce una excepción no gestionada durante la ejecución del pipeline

Controller: Tipos de filtro

Orden de ejecución:

  • Authentication filters
  • Authorization filters
  • Action filters
  • Result filters

 

Model: ViewModel

  • Es una clase que contiene todas las propiedades necesarias en la vista para la que está generado.
  • A diferencia del modelo, que al ser una entidad de dominio, sólo contiene sus propiedades.
  • No contiene lógica de negocio.
  • La vista queda fuertemente tipada.
  • Transfieren datos del controlador a la vista.
  • El "binding" reconstruye el viewmodel en el paso de la vista al controlador.
  • Puede contener más de una entidad u objeto.
  • Mapeo de propiedades mediante automapper.

 

Model: Data Annotations

Data annotations: Atributos utilizados para definir reglas de validación, mensajes y textos enfocados al usuario.

Permiten el uso de localización.

Se usan en el modelo o en el viewmodel.

 

  • [DataType]: Especifica el tipo de dato
  • [DisplayName]: Nombre a mostrar
  • [Required]: Indica si es requerido
  • [MaxLength]: Indica la máxima longitud
  • [Range]: Valida el valor entre el rango especificado

 

Model: Localización

Mediante Data annotations y Atributos podemos utilizar diferentes idiomas para mostrar el nombre de cada propiedad.

La localización se realiza mediante ficheros de recursos.

  • [Display(Name = "Title", ResourceType = typeof(CustomersTranslations))]
  • [Required(ErrorMessageResourceName = "Validation_Required", ErrorMessageResourceType = typeof(ModelTranslations))]

3. Arquitectura empresarial

Modelo propuesto

El modelo consta de las siguientes clases:

  • Empresa, Producto, Cliente, Factura

 

En el esquema propuesto no existe relación entre la Empresa y los productos ni los clientes (No es muy lógico, sólo para los ejemplos)

 

 

Esquema modelo propuesto

Lógica de negocio

La empresa emite facturas a los clientes. Estas facturas contienen líneas con productos.

Al generar una nueva factura debe crearse su referencia unívoca

La factura tiene dos estados:

  • Sin registrar
  • Registrada

En una factura "Sin registrar" pueden realizarse cambios. Cuando está "Registrada", la factura queda cerrada.

Creación de las capas

Creación de las capas

Capa de persistencia de datos y capa de dominio

  • Generar el modelo a partir del esquema de la base de datos
  • Separar las entidades de dominio en la capa de dominio
  • Crear los contratos (interfaces) de los repositorios (genérico y concreto) y Unit of Work
  • Crear las implementaciones de los repositorios (genérico y concreto) y Unit of Work

Creación de las capas

Capa de aplicación (Servicios de aplicación)

  • Crear los DTOs necesarios
  • Generar el interfaz y la implementación del servicio

Infraestructura

Capa de aplicación (Servicios de aplicación)

  • Instalar el contenedor de inyección de dependencias Unity.
  • Registrar los tipos.
  • Automapper en la capa de servicio (Model <-> DTO).

Desarrollo en ASP.NET MVC

By Javier Sanjuan

Desarrollo en ASP.NET MVC

  • 1,011