Implementación de MVC con Windows Forms

¿Dónde puedo encontrar un buen ejemplo sobre cómo implementar completamente el patrón MVC en Windows Forms?

Encontré muchos tutoriales y ejemplos de código en varios sitios (por ejemplo, The Code Project y .NetHeaven), pero muchos son más representativos para el patrón de observador que MVC. Dado que la aplicación que deseo desarrollar es para un proyecto escolar, soy reacio a utilizar marcos como PureMVC o MVC # .

Soy de la opinión de que las aplicaciones son tan diferentes entre sí y nuestra comprensión de cómo se deben escribir las aplicaciones es aún muy limitada. Las aplicaciones pasadas de Windows Forms en las que he trabajado han sido muy diferentes entre sí. Algunas de las diferencias de diseño que he visto son (incluidas la mayoría de las combinaciones):

  • Directamente hablar a la base de datos (2 niveles)
  • Use un back-end que se haya escrito para la aplicación determinada (3 niveles)
  • Utilice un conjunto de servicios web escritos para su uso por muchas aplicaciones y que no se pueden modificar para su aplicación. (Arquitectura orientada a Servicios)
  • Actualizaciones realizadas por las operaciones de CRUD
  • Actualizaciones que se realizan con el patrón de comando (envío de comandos al servidor backend)
  • Muchos usos de enlace de datos / sin uso de enlace de datos
  • La mayoría de los datos son “similares a las tablas” (por ejemplo, facturas) que funcionan bien en los controles de cuadrícula estándar / necesitan controles personalizados para la mayoría de los datos de la interfaz de usuario.
  • Un desarrollador / equipos de 10 o 20 desarrolladores (solo en la interfaz de usuario)
  • Muchas pruebas de unidades usando burlas, etc / sin pruebas de unidades

Por lo tanto, no creo que sea posible crear una implementación de MVC (o MVP) que siempre se adapte bien.

Las mejores publicaciones que he visto explicando realmente MVC y por qué un sistema MVC está construido tal como es, es la serie “Build Your Own CAB” de Jeremy D Miller . Después de trabajar, deberías poder entender tus opciones mucho mejor. También debe tenerse en cuenta la Guía de Smart Client de Microsoft (Bloque de aplicaciones compuestas CAB / Microsoft) . Es un poco complejo, pero puede funcionar bien para aplicaciones que se ajustan bien.

La selección de una implementación de MVC / MVP para un proyecto de Winforms brinda una descripción general que vale la pena leer. Mucha gente como PureMVC . Nunca lo he usado, pero lo vería la próxima vez que necesite un framework MVC.

” Presenter First ” es un enfoque de desarrollo de software que combina las ideas del patrón de diseño Model View Presenter (MVP) y el desarrollo basado en pruebas . Le permite comenzar escribiendo pruebas en el idioma del cliente. Por ejemplo:

“Cuando hago clic en el botón ‘guardar’, el archivo debe guardarse y la advertencia del archivo no guardado debería desaparecer”.

No tengo experiencia en usar “Presenter First”, pero lo intentaré cuando tenga oportunidad, ya que parece muy prometedor.

Otras preguntas sobre desbordamiento de stack que quizás quiera consultar están aquí y aquí .

Si está pensando en usar WPF en cualquier momento, eche un vistazo al patrón Model-View ViewModel (MVVM) . Aquí hay un muy buen video que debería ver: Jason Dolinger en Model-View-ViewModel .

MVVM (Model View View Model) El patrón de diseño para Winforms brinda otra opción que puede facilitar la conversión a WPF si fuera necesario. Magical.Trevor es otra muestra de MVVM para Windows Forms que también incluye enlaces automáticos basados ​​en nombres de propiedades.


También pregúntese por qué está usando MVC.

  • ¿Desea poder probar la unidad tanto código como sea posible?
  • ¿Estás tratando de permitir que se reutilice la mayor cantidad de código posible?
  • ¿Estás tratando de hacer que tu código base sea fácil de entender?
  • 101 otras razones que pueden ser válidas para un proyecto determinado.

Una vez que tenga claro sus objectives , será más fácil elegir una implementación u otra.

ACTUALIZACIÓN: Además de mi respuesta anterior a continuación, sugiero leer sobre el enfoque “Presentador Primero” (especialmente los artículos PDF)

Recomendaría MVP (patrón PassiveView en realidad) en lugar de MVC. Realmente no necesitas marcos especiales para esto, es solo cómo organizas tu código.

Un enfoque (que generalmente uso) es dividir cada formulario de Windows en tres entidades:

  1. Una clase de presentador / controlador: esto es con lo que realmente comienza cuando desarrolla un formulario. Aquí es donde debe residir la mayor parte o la totalidad de su lógica de “negocios”.
  2. Una interfaz de vista (IView), que contiene los métodos, propiedades y eventos. Esta interfaz es todo lo que el presentador conoce sobre su formulario.
  3. Al final, cuando termine de implementar el presentador y la vista (incluidas las pruebas unitarias), puede crear la clase de formulario real y hacer que implemente la interfaz IView. Entonces solo se trata de agregar controles apropiados al formulario y conectarlos a la interfaz.

Código de ejemplo (un pseudocódigo simple, solo para ilustración):

interface IView { string Username { get; set; } string Password { get; set; } event EventHandler LogOnButtonClicked; void InformUserLogOnFailed(); void MoveToMainScreen(); } class Presenter { public Presenter(IView view) { this.view = view; view.LogOnButtonClicked += new EventHandler(OnLogOnButton); } private void OnLogOnButton() { // we ask some service to verify the username/password bool isLogOnOk = logOnService.IsUserAndPasswordOk(view.Username, view.Password); if (isLogOnOk) view.MoveToMainScreen(); else { view.Username = ""; view.Password = ""; view.InformUserLogOnFailed(); } } private IView view; } class Form : IView { public Form() { presenter = new Presenter(this); } public string Username { get { return TextBoxUsername.Text; } set { TextBoxUsername.Text = value; } } public string Password { get { return TextBoxPassword.Text; } set { TextBoxPassword.Text = value; } } public void InformUserLogOnFailed() { MessageBox.Show("Invalid username or password."); } public void MoveToMainScreen() { // code for opening another form... } private Presenter presenter; } 

¿Has mirado PureMVC ? Descubrí que nadie puede ponerse de acuerdo sobre cómo se ve realmente MVC una vez que comienzan a construir una implementación específica.

Actualización: puede crear la suya a partir de algo más simple como MobileMVC . El código Compact Framework debería comstackr / ejecutar OK en Windows. Como se trata de una tarea escolar, le sugiero que realmente dedique algo de tiempo a aprender cómo funciona el MVC.

Es posible que desee echar un vistazo a la ejecución diferencial .

Aquí está en SourceForge

OMI, es una gran mejora en MVC, aunque todavía es bastante inusual.

Un buen ejemplo para implementar su propia implementación de MVC usando Windows Forms se puede encontrar aquí . El código fuente está incluido.

Mientras lees, estudias y escribes el código para esta tarea, encontrarás que hay muchos desacuerdos sobre cómo se debe implementar el MVC. Este es un caso simple que refleja la separación de preocupaciones, así como un buen ejemplo de la ‘fontanería’ necesaria para conectar esto.

Cuando estás fuera de la escuela, es probable que quieras recurrir a un marco como los otros carteles han recomendado.

El bloque de aplicación de interfaz compuesta de Microsoft comenzó su vida como una implementación de MVC (entre otros patrones que implementó). La versión de lanzamiento, sin embargo, se convirtió en una implementación de MVP, que se puede argumentar como una especie de interpretación diferente del concepto de MVC.

Si está dispuesto a verificar el código de una implementación de MVP muy completa (y de alguna manera compleja), puede encontrar el MS-CAB como uno de los componentes de Microsoft Smart Client Software Factory. Viene con el código fuente. Puedes encontrarlo aquí . ¡Buena suerte!