Patrones de diseño – Muestras de patrones MVC para principiantes
Explica qué es MVC Pattern y qué es ASP.NET MVC Framework y cómo funciona. También explica el ciclo de vida de la página ASP.NET MVC y las características de ASP.NET MVC en cuanto a la versión.
Las muestras proporcionaron pasos sabios para ayudar a los principiantes a comprender fácilmente y dominar ASP.NET MVC.
Como todos conocemos, muchos patrones de diseño y su uso en la implementación de componentes y servicios comerciales en nuestras aplicaciones, pero aun así enfrentaremos problemas/desafíos con nuestras aplicaciones. También día a día las necesidades y prioridades comerciales cambiarán. Si observamos de cerca una serie de problemas, defectos y desafíos a los que nos enfrentamos, es en las capas de interfaz de usuario y presentación. Aunque algunos defectos están relacionados con la lógica comercial y las reglas comerciales, es posible que debamos corregirlos en las capas de presentación y la interfaz de usuario, ya que podríamos integrar la lógica comercial en los niveles de presentación y la interfaz de usuario. La razón detrás de esto es que no nos hemos centrado en implementar el patrón de diseño correcto en nuestras aplicaciones. Veamos paso a paso y comprendamos cómo implementar y usar el patrón de presentación en nuestras aplicaciones.
Planteamiento del problema:
- Ya se utilizan diferentes patrones en la aplicación, pero aún es difícil mantener la aplicación.
- Usando VS Test, NUnit, MBUnit, etc. para probar la capa de lógica de negocios, pero aún existen algunos defectos en la aplicación como lógica de negocios involucrada en la capa de presentación.
- Se usó la capa de presentación, la capa de lógica de negocios, la capa de acceso a datos en la aplicación, pero a veces se necesita escribir código redundante en la capa de presentación para consumir o llamar a otros módulos u otros casos de uso.
- Los defectos de integración se inyectan cuando hacemos algunos cambios en los módulos integrados.
- La corrección de defectos y las mejoras están tomando más tiempo para analizar la lógica del nivel de presentación y sus dependencias de integración y provocando la apertura de nuevos defectos.
- No se puede elegir ASP.NET MVC porque la interfaz de usuario es compleja de construir.
Causa raíz del problema:
En la capa de presentación,
- Una página o formulario contiene controles que muestran datos del dominio de la aplicación. Un usuario puede modificar los datos y enviar los cambios. La página recupera los datos del dominio, maneja los eventos del usuario, modifica otros controles en la página en respuesta a los eventos y envía los datos del dominio modificados. Incluir el código que realiza estas funciones en la página web Además, es difícil compartir código entre páginas web que requieren el mismo comportamiento. la clase compleja, difícil de mantener y difícil de probar.
- La capa de interfaz de usuario, la lógica de interfaz de usuario, la lógica de presentación y la lógica empresarial están estrechamente acopladas.
- La capa de presentación se encarga de integrar módulos o casos de uso.
Solución:
- Elija el mejor patrón de capa de presentación para separar la capa de interfaz de usuario, la lógica de interfaz de usuario y la lógica de presentación y la lógica de negocios como capas separadas para que el código sea más fácil de entender y mantener.
- Habilite el acoplamiento flexible mientras desarrolla módulos o cualquier caso de uso.
- Maximice el código que se puede probar con la automatización. (Las vistas son difíciles de probar).
- Comparta código entre páginas que requieran el mismo comportamiento.
- Separe las responsabilidades de la visualización y el comportamiento del manejo de eventos en diferentes clases denominadas, respectivamente, la vista y el presentador o controlador o ViewModel.
Beneficios de usar el patrón de presentación:
- Modularidad
- Enfoque basado en pruebas: maximice el código que se puede probar con la automatización
- Separación de intereses
- Código compartido entre páginas y formularios
- Facil de mantener
¿Cuáles son los patrones de capa de presentación disponibles?
MVC (controlador de vista de modelo)
MVP (presentador de vista de modelo) o (vista pasiva de modelo, controlador de supervisor)
MVVM (Modelo Vista VistaModelo)
MVC contra MVP contra MVVM:
-
¿El modelo y la vista representan lo mismo en los 3 patrones anteriores?
Sí
-
¿El propósito del controlador, el presentador y el modelo de vista es el mismo en los 3 patrones anteriores?
Sí
-
¿La comunicación y el flujo de Model, View with Controller, Presenter y ViewModel son los mismos?
No, esa es la razón por la que existen estos 3 patrones.
-
¿Estos patrones reemplazan a PL (capa de presentación), BLL (capa de lógica comercial) y DAL (capa de acceso a datos)?
No, estos patrones son para separar la interfaz de usuario y la lógica de la interfaz de usuario de la lógica de presentación y permiten el acoplamiento flexible.
Elija el mejor patrón de capa de presentación:
jugador más valioso
- La vinculación a través de un contexto de datos no es posible
- Diseño de interfaz de usuario complejo
- Lo mejor para Windows Forms, ASP.NET Web Forms y Sharepoint Applications
MVC
- Mejor para ASP.NET con interfaz de usuario simple
- Modelo desconectado (ver la separación de todas las demás capas)
Nota: Aquí no me centro en MVC VM (MVC ViewModel de MVC3) y ASP.NET MVVM con inyección de dependencia.
MVVM
- La vinculación a través de un contexto de datos es posible
- Modelo conectado
- Mejor para aplicaciones WPF y Silverlight
Formularios web ASP.NET frente a ASP.NET MVC:
Formularios web ASP.NET
- RAD
- Desarrollo más fácil
- Rico ecosistema de controles
- Familiar como el enfoque de desarrollo para el desarrollo de Windows Forms
- Sin
ViewState
y sin soporte de devolución de datos
ASP.NET MVC
- Separación limpia de preocupaciones (SoC)
- Control total de marcado
- Habilitar TDD (Desarrollo dirigido por pruebas)
- Habilita y hace REST fácilmente
- Integración más fácil del lado del cliente (Javascript)
- Multi View Engine (¡esto es realmente genial!)
- Sin ViewState y sin soporte de devolución de datos
- Extensible y WEB 2.0 Habilitado
Modelo, vistas y controlador
- Modelo: los objetos del modelo son las partes de la aplicación que implementan la lógica para el dominio de datos de la aplicación. A menudo, los objetos del modelo recuperan y almacenan el estado del modelo en una base de datos. Por ejemplo, un objeto Producto podría recuperar información de una base de datos, operar en ella y luego volver a escribir información actualizada en una tabla Productos en SQL Server.
- Vistas: las vistas son los componentes que muestran la interfaz de usuario (UI) de la aplicación. Normalmente, esta interfaz de usuario se crea a partir de los datos del modelo. Un ejemplo sería una vista de edición de una tabla de productos que muestra cuadros de texto, listas desplegables y casillas de verificación según el estado actual de un objeto de productos.
- Controlador: los controladores son los componentes que manejan la interacción del usuario, trabajan con el modelo y, en última instancia, seleccionan una vista para renderizar que muestra la interfaz de usuario. En una aplicación MVC, la vista solo muestra información; el controlador maneja y responde a la entrada e interacción del usuario. Por ejemplo, el controlador maneja los valores de cadena de consulta y pasa estos valores al modelo, que a su vez consulta la base de datos utilizando los valores.
¿Ciclo de vida de página de alto nivel de ASP.NET MVC?
¿Ciclo de vida de página de bajo nivel de ASP.NET MVC?
Nuevas características de MVC2.0
1 ayudantes con plantilla:
Los asistentes con plantillas nos ayudan a asociar automáticamente elementos HTML para editarlos y mostrarlos con tipos de datos.
Por ejemplo, cuando System.DateTime
se muestran datos de tipo en una vista, se puede representar automáticamente un elemento de interfaz de usuario selector de fecha.
Esto es similar a cómo funcionan las plantillas de campo en ASP.NET Dynamic Data.
2 Áreas:
Uso de áreas Podemos organizar un proyecto grande en varias secciones más pequeñas para administrar la complejidad de una aplicación web grande.
Cada sección ("área") normalmente representa una sección separada de un sitio web grande y se usa para agrupar conjuntos relacionados de controladores y vistas.
P.ej
Areas
Admin
Controllers
Models
Views
Iniala Claims
Controllers
Models
Views
3 Compatibilidad con controladores asíncronos:
ASP.NET MVC2 permite que los controladores procesen las solicitudes de forma asíncrona.
Esto puede conducir a mejoras en el rendimiento al permitir que los servidores que llaman con frecuencia a operaciones de bloqueo (como solicitudes de red) llamen a sus homólogos que no bloquean.
4 Compatibilidad con DefaultValueAttribute
los parámetros del método de acción:
La System.ComponentModel.DefaultValueAttribute
clase permite proporcionar un valor predeterminado para el parámetro de argumento a un método de acción.
Por ejemplo, suponga que se define la siguiente ruta predeterminada:
{controller}/{action}/{id}
Suponga también que se define el siguiente controlador y método de acción:
public class ArticleController
{
public ActionResult View(int id, [DefaultValue(1)]int page)
{
}
}
Cualquiera de las siguientes URL de solicitud invocará el método de acción Ver que se define en el ejemplo anterior.
- /Artículo/Ver/123
- /Article/View/123?page=1 (Efectivamente igual que la solicitud anterior)
- /Artículo/Ver/123?página=2
5 Soporte para vincular datos binarios con Model Binders:
Hay dos nuevas sobrecargas del Html.Hidden
ayudante que codifican valores binarios como cadenas codificadas en base 64:
public static string Hidden(this HtmlHelper htmlHelper, string name, Binary value);
public static string Hidden(this HtmlHelper htmlHelper, string name, byte[] value);
6 Soporte para DataAnnotations
atributos:
Usar los atributos de validación, , y (definidos en el RangeAttribute
espacio RequiredAttribute
de StringLengthAttribute
nombres) cuando nos vinculamos a un modelo para proporcionar validación de entrada.RegexAttribute``System.ComponentModel.DataAnnotations
using System.ComponentModel.DataAnnotations;
namespace MvcTmpHlprs
{
[MetadataType(typeof(ProductMD))]
public partial class Product
{
public class ProductMD
{
public object SellStartDate { get; set; }
[UIHint("rbDate")]
public object SellEndDate { get; set; }
[DataType(DataType.Date)]
public object DiscontinuedDate { get; set; }
[ScaffoldColumn(false)]
public object ModifiedDate { get; set; }
[ScaffoldColumn(false)]
public object rowguid { get; set; }
[ScaffoldColumn(false)]
public object ThumbnailPhotoFileName { get; set; }
}
}
}
7 proveedores de validadores de modelos:
La clase de proveedor de validación de modelos representa una abstracción que proporciona lógica de validación para el modelo.
ASP.NET MVC incluye un proveedor predeterminado basado en atributos de validación que se incluyen en el espacio de System.ComponentModel.DataAnnotations
nombres.
8 Validación del lado del cliente:
La clase de proveedor del validador de modelos expone los metadatos de validación al navegador en forma de datos serializados JSON que pueden ser consumidos por una biblioteca de validación del lado del cliente.
ASP.NET MVC 2 incluye una biblioteca de validación de clientes y un adaptador que admite los DataAnnotations
atributos de validación de espacios de nombres mencionados anteriormente.
9 Nuevo RequireHttpsAttribute
filtro de acción:
ASP.NET MVC 2 incluye una nueva RequireHttpsAttribute
clase que se puede aplicar a métodos de acción y controladores.
De forma predeterminada, el filtro redirige una solicitud no SSL (HTTP) al equivalente habilitado para SSL (HTTPS).
10 Anulación del verbo del método HTTP:
Cuando construimos un sitio web usando el estilo arquitectónico REST, los verbos HTTP se usan para determinar qué acción realizar para un recurso.
REST requiere que las aplicaciones admitan la gama completa de verbos HTTP comunes, incluidos GET
, PUT
, POST
y DELETE
.
ASP.NET MVC 2 incluye nuevos atributos que podemos aplicar a los métodos de acción y que cuentan con una sintaxis compacta.
Estos atributos permiten que ASP.NET MVC seleccione un método de acción basado en el verbo HTTP.
Por ejemplo, una POST
solicitud llamará al primer método de acción y una PUT
solicitud llamará al segundo método de acción.
[HttpPost]
public ActionResult Edit(int id)
[HttpPut]
public ActionResult Edit(int id, Tag tag)
En versiones anteriores de ASP.NET MVC, estos métodos de acción requerían una sintaxis más detallada, como se muestra en el siguiente ejemplo:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id)
[AcceptVerbs(HttpVerbs.Put)]
public ActionResult Edit(int id, Tag tag)
Debido a que los navegadores solo admiten los verbos GET
y POST
HTTP, no es posible publicar una acción que requiera un verbo diferente. Por lo tanto, no es posible admitir de forma nativa todas las RESTful
solicitudes.
Sin embargo, para admitir RESTful
solicitudes durante las POST
operaciones, ASP.NET MVC 2 presenta un nuevo HttpMethodOverride
método auxiliar HTML.
Este método genera un elemento de entrada oculto que hace que el formulario emule de manera efectiva cualquier método HTTP.
Por ejemplo, al usar el HttpMethodOverride
método auxiliar HTML, podemos hacer que el envío de un formulario aparezca como una solicitud PUT
o .DELETE
El comportamiento de HttpMethodOverride
afecta a los siguientes atributos:
HttpPostAttribute
HttpPutAttribute
HttpGetAttribute
HttpDeleteAttribute
AcceptVerbsAttribute
11 nueva HiddenInputAttribute
clase para ayudantes con plantilla:
Podemos aplicar el nuevo HiddenInputAttribute
atributo a una propiedad de modelo para indicar si un elemento de entrada oculto debe representarse al mostrar el modelo en una plantilla de editor (el atributo establece un UIHint
valor implícito de HiddenInput
).
La DisplayValue
propiedad del atributo nos permite especificar si el valor se muestra en los modos de edición y visualización.
Cuando DisplayValue
se establece en falso, no se muestra nada, ni siquiera el marcado HTML que normalmente rodea un campo.
El valor predeterminado para DisplayValue
es verdadero.
Podríamos usar HiddenInputAttribute
el atributo en los siguientes escenarios:
- Cuando una vista permite a los usuarios editar la ID de un objeto y es necesario mostrar el valor y proporcionar un elemento de entrada oculto que contenga la ID anterior para que pueda devolverse al controlador.
- Cuando una vista permite a los usuarios editar una propiedad binaria que nunca debería mostrarse, como una propiedad de marca de tiempo.
En ese caso, el valor y el marcado HTML que lo rodea (como la etiqueta y el valor) no se muestran.
P.ej:
public class ProductViewModel
{
[HiddenInput] // equivalent to [HiddenInput(DisplayValue=true)]
public int Id { get; set; }
public string Name { get; set; }
[HiddenInput(DisplayValue=false)]
public byte[] TimeStamp { get; set; }
}
12 Html.ValidationSummary
El método auxiliar puede mostrar errores a nivel de modelo:
En lugar de mostrar siempre todos los errores de validación, el Html.ValidationSummary
método auxiliar tiene una nueva opción para mostrar solo los errores a nivel de modelo.
Esto permite que los errores a nivel de modelo se muestren en el resumen de validación y los errores específicos de campo se muestren junto a cada campo.
13 plantillas T4 en Visual Studio generan código que es específico para la versión de destino de .NET Framework:
Una nueva propiedad está disponible para los archivos T4 del host ASP.NET MVC T4 que especifica la versión de .NET Framework que usa la aplicación.
Esto permite que las plantillas T4 generen código y marcado que es específico de una versión de .NET Framework.
En Visual Studio 2008, el valor siempre es .NET 3.5. En Visual Studio 2010, el valor es .NET 3.5 o .NET4.
14 mejoras de la API:
CreateActionInvoker
Se agregó un método virtual protegido en la clase Controlador.
Este método es invocado por la ActionInvoker
propiedad de Controller y permite la instanciación diferida del invocador si no se ha establecido ningún invocador.