MVP (Model View Presenter) usando .NET

Ultimamente estuve revisando lo que es WCSF (Web Client Software Factory) entre todo el rollo ahi vi lo que es el patron MVP (Model View Provider), bueno mas antes lo vi cuando leia algo de patrones de arquitectura en el libro de Martin Fowler pero esas veces no le di tanta importancia.

Problema:

Anteriormente los que al igual que yo estaban en tiempos de ASP 3.0 recordaran el caos que se armaba con una sola pagina al mezclar codigo HTML con codigo fuente, a partir de aqui nacio la idea de separar el codigo fuente del diseño (osea HTML) esto ya vino con lo que es ASP.NET pues este paso fue grandioso aunque al principio duro de acostumbrarse, pero nos aligero el trabajo enormemente.

Bueno hasta aca tenemos el codigo separado del diseño, pero aun tenemos dependencia de la presentacion, es decir si bien podemos tener una arquitectura en capas aun tenemos muchas cosas en la presentacion y que si queremos pasar de web a windows pues el trabajo es aun arduo, y pues aca necesitamos algo, entonces porque no repetimos lo que se hizo al devidir la presentacion de el codigo, pero partamos al codigo (partamos en el buen sentido de la palabra), entonces coloquemos en un lado el codigo exclusivo que trabaje con los controles de la presentacion que tengamos y por otro el codigo de las llamadas a las capas manejo de entidades, etc. Pues aca en este entorno podemos usar MVP que es el patron que nos ayuda a resolver esto.

Historia MVP:

Pues comentarles que MVP nacio a partir del modelo MVC (Model View Controller) no hablaremos acerca de este, pero decirles que MVC fue usado por Smalltalk a partir de los años 80 (y yo recien enterandome y aprendiendo MVP) y de aca MVP es una mutacion si podriamos llamarlo asi que nace a partir de MVC.

Implementacion (Teoria):

Antes de nada quiero mostrarles el modelo

Modelo MVP

Donde View = Nuestra vista seria nuestro formulario windows o web (u otro segun la presentacion que tengamos).

IView = Es la interfaz que nuestro View implementa, es decir aca estaran todos los campos o controles que tendar nuestra vista

Presenter = Pos este es el mero mero, osea el que hace todo, aca se maneja las entidades, se llena datos en la vista, etc. en lo posible hay que tratar de que el codigo este en este miembro

Model = Es nuestra entidad, es decir las clases que representan nuestras entidades, donde se puede ver que solo el presenter tiene acceso a estas para luego mostrarlas en la vista.

Implementacion (Practica .NET):

Para este ejemplo no mostraremos codigo de capas, sino nos enfocaremos en lo que es el MVP solo la presentacion, para esto vamos a colocar un caso imaginario donde registramos a una persona a nuestro sistema, y tenemos la pantalla para este fin (View), nuestra pantalla windows quedaria asi (estoy usando paneles):

windows.jpg

En Web nuestra pantalla seria la siguiente (estoy usando un multiview):

web.jpg

hasta aca tenemos las pantallas tanto para windows como para web, que tendran el mismo objetivo, registrar a una persona.

Ahora dejemos de lado las pantallas y pensemos solo que tenemos una digamos windows, y nos tocaria hacer la interfaz (IView), hasta aca veamos la estructura del proyecto primero para ambientarnos:

proyecto.jpg

Noten que en el proyecto tengo View, IView, Presenter, pero no tengo Model porque seria mi entidad y en este caso estamos omitiendo las capas y la entidad formaria parte de una capa pero esto no nos detiene para realizar nuestro MVP. Continuemos con el IView

iview.jpg

como podran ver en el IView coloco las propiedades y metodos que tendra mi Vista (View) es decir colocamos todo lo que podremos manejar desde el Presenter. El siguiente paso seria que nuestra Vista (Formulario) implemente esta interfaz con lo que tendriamos:

vista.jpg

como veran implemento la interfaz en nuestra vista y en la parte guardar llamo a mi presenter (en seguida veremos como queda el presenter) donde el presenter es el que se encarga de realizar la operacion de guardar, ya sea llamando a un servicio de las capas o si no se esta manejando capas desde el mismo presenter, lo aconsejable siempre es trabajar con capas. Como dice Jack el destripador “Lo que importa es lo de adentro” asi que veamos como queda nuestro Presenter.

presenter.jpg

En nuestro Presenter manejamos los eventos que provoca nuestra Vista de esta forma tenemos que la mayor parte del codigo este en el Presenter.

Ahora para migrar esto a Web lo unico que hacemos es tener la vista (View), hacer que implemente la interfaz (IView) y listo lo demas funcionara igual, espero les sirva y posteriormente estare mostrando implementaciones mas avanzadas usando entidades y colecciones.

Hasta la proxima

KEV

13 comentarios en “MVP (Model View Presenter) usando .NET

  1. hola muy interesante tu ejemplo, podrías pasármelo para descargarlo??? ya que a mi no me funciono

    de antemano muchas gracias!!!

    Responder
  2. Hola espero que estes muy bien,,,,,,te doy muchas gracias…..por publicar ejemplos como este…..sigue asi….y espero que me escriba al correo para estar mas en contacto……me gusta mucho la programacion …100% vb.net ….se le agradece de corazon….Saludos desde colombia!

    Responder
  3. me parecio interesante el manejo mediante este modelamiento podrias decirme o poner el enlace para descargar el ejemplo o extender mas este tema con los ejemplos q colocaste.

    muchas gracias

    Responder
  4. Pingback: Como crear Menús Dinámicos con ASP .NET usando patron Model View Presenter (1ra Parte) « Blog de Tecnologia y Desarrollo Web

  5. Pingback: Como crear Menús Dinámicos con ASP .NET usando patron Model View Presenter (2da Parte) « Blog de Tecnologia y Desarrollo Web

  6. Pingback: portable table saws

  7. Pingback: Como crear Menús Dinámicos con ASP .NET usando patron Model View Presenter (2da Parte) « Blog de Tecnologia y Desarrollo Web

  8. Pingback: Como crear Menús Dinámicos con ASP .NET usando patron Model View Presenter (3ra Parte) « Blog de Tecnologia y Desarrollo Web

  9. Hola.

    Muchas gracias por compartir el ejemplo.

    Quisiera saber tu opinión al respecto. El contrato creo que no debería señalar operaciones, sino que el presentador debería implementar tantas operaciones como el negocio requiera (para utilizar los objetos y reglas de negocio).

    De esta forma, el código en los eventos de los botones y demás controles solo llaman a las operaciones del presentador, el cual al finalizar actualiza la vista como corresponda.
    Si se presentaren nuevas operaciones sobre la misma vista, simplemente habría que modificar el presentador (suponiendo que las nuevas operaciones se realizan con la misma vista, sin controles adicionales).

    Bueno, saludos y muchas gracias por compartir el conocimiento.

    Responder
  10. Hola, me parece bueno el tutorial. Lo que si te corregiría, es que los métodos nuevo y guardar, no se los crea en la vista, sino mas bien en el presenter. Si bien, el patrón no restringe esto, lo correcto es que sea el presenter quien maneje estas lógicas (guardar y crear nuevo) invocando como crea necesario las propiedades de la vista.
    Saludos.

    Responder
  11. Hola buenas noches, estoy tratando de implementar el modelo con una adición, una capa de formularios (libreria dll) donde le referencio el proyecto Presentador y poder tener otro proyecto winforms donde probar los forms comentados en la capa de formularios. No me ha funcionado o no me deja implementar la interface en alguno de los formularios, es viable esta situación o solo en formularios de proyecto winform o webform, estoy usando c#.

    Gracias por adelantado por sus sugerencias

    Monterrey Mexico lun 22ABR2019

    Responder

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s