Implementando MVC con Windows Forms

102

¿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 quiero desarrollar es para un proyecto escolar, soy reacio a usar marcos como PureMVC o MVC # .

kjv
fuente

Respuestas:

115

Soy de la opinión de que las aplicaciones son muy diferentes entre sí y nuestra comprensión de cómo deben escribirse las aplicaciones es todavía muy limitada. Las aplicaciones anteriores 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 (incluida la mayoría de combinaciones):

  • Hablar directamente con la base de datos (2 niveles)
  • Use un backend que se haya escrito para la aplicación dada (3 niveles)
  • Utilice un conjunto de servicios web que fueron escritos para su uso por muchas aplicaciones y que no se pueden cambiar para su aplicación. (Arquitectura orientada a Servicios)
  • Actualizaciones realizadas por CRUD operaciones
  • Actualizaciones que se realizan con el patrón de comando (envío de comandos al servidor backend)
  • Muchos usos de la vinculación de datos / sin usos de la vinculación de datos
  • La mayoría de los datos son "como una tabla" (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 unitarias usando simulacros, etc. / sin pruebas unitarias

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

Las mejores publicaciones que he visto que realmente explican MVC y por qué un sistema MVC está construido de la forma en que está, es la serie "Build Your Own CAB" de Jeremy D Miller . Después de trabajar en él, debería poder comprender mucho mejor sus opciones. También se debe considerar la Guía de Smart Client de Microsoft (CAB / Microsoft Composite Application Block) . Es un poco complejo, pero puede funcionar bien para aplicaciones que encajan 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. A mucha gente le gusta PureMVC . Nunca lo he usado, pero lo vería la próxima vez que necesite un marco 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 debería guardarse y la advertencia de archivo no guardado debería desaparecer".

No tengo experiencia en el uso de "Presenter First", pero lo intentaré cuando tenga la oportunidad, ya que parece muy prometedor.

Otras preguntas de Stack Overflow que quizás desee ver 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 video muy bueno que debería ver: Jason Dolinger en Model-View-ViewModel .

El patrón de diseño MVVM (Model View View Model) para Winforms ofrece otra opción que puede facilitar la conversión a WPF si alguna vez es necesario. Magical.Trevor es otra muestra de MVVM para Windows Forms que también incluye enlace automático basado en nombres de propiedad.


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

  • ¿Desea poder realizar pruebas unitarias con la mayor cantidad de código posible?
  • ¿Está intentando permitir que se reutilice la mayor cantidad de código posible?
  • ¿Está intentando que su código base sea fácil de entender?
  • 101 otras razones que pueden ser válidas para un proyecto determinado.

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

Ian Ringrose
fuente
@AgnelKurian, el CAB era un conjunto de código de muestra de Microsoft sobre cómo crear aplicaciones; ahora es principalmente historia.
Ian Ringrose
¡Jaja! Sí, ahora recuerdo esos "Bloques de aplicaciones".
Agnel Kurian
45

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

Recomendaría MVP (patrón PassiveView en realidad) en lugar de MVC. Realmente no necesita ningún marco especial para esto, es solo cómo organiza su código.

Un enfoque (que suelo tomar) es dividir cada formulario de ventana en tres entidades:

  1. Una clase de presentador / controlador: esto es con lo que realmente comienza al desarrollar un formulario. Aquí es donde debe residir la mayor parte / toda 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 sabe 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 es solo una cuestión de agregar los 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;
}
Igor Brejc
fuente
7
Esta es una implementación de la variante MVP llamada PassiveView. En la vista pasiva, la vista no debería elegir a su presentador. Para obtener un ejemplo similar (pero con una vista REALMENTE pasiva), consulte este ejemplo danieleteti.it/?p=221 (ejemplo en lenguaje Delphi)
Daniele Teti
6

¿Ha 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 el suyo propio comenzando con algo más simple como MobileMVC . El código de Compact Framework debe compilarse / ejecutarse correctamente en Windows. Dado que esta es una tarea de la escuela, le sugiero que dedique un tiempo a aprender cómo funciona MVC.

Brian Lyttle
fuente
Tengo una tarea escolar para una aplicación muy simple para administrar una librería, y soy bastante reacio a usar un marco como PureMVC. Busco algo más sencillo.
kjv
3

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

Aquí está en SourceForge

En mi opinión, es una gran mejora en MVC, aunque todavía es bastante inusual.

Mike Dunlavey
fuente
2

Aquí puede encontrar un buen ejemplo de cómo implementar su propia implementación de MVC usando Windows Forms . Se incluye el código fuente.

A medida que lea, estudie y escriba el código para esta tarea, encontrará que hay muchos desacuerdos sobre cómo se debe implementar MVC. Este es un caso simple que refleja la separación de preocupaciones, así como un buen ejemplo de la 'plomería' necesaria para conectarlo.

Cuando esté fuera de la escuela, probablemente querrá recurrir a un marco como los otros carteles han recomendado.

Gary.Ray
fuente
2

El bloque de aplicaciones de interfaz compuesta de Microsoft comenzó su vida como una implementación MVC (entre otros patrones que implementó). Sin embargo, la versión de lanzamiento evolucionó hacia una implementación de MVP, que se puede argumentar que es una especie de interpretación diferente del concepto MVC.

Si está dispuesto a comprobar el código de una implementación 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 código fuente. Puedes encontrarlo aquí . ¡Buena suerte!

Rui Craveiro
fuente