Implementación de MVC con Windows Forms

Resuelto kjv asked hace 15 años • 6 respuestas

¿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 del patrón de observador que MVC. Dado que la aplicación que quiero desarrollar es para un proyecto escolar, soy reacio a utilizar marcos como PureMVC o MVC# .

kjv avatar Mar 17 '09 22:03 kjv
Aceptado

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 eran muy diferentes entre sí. Algunas de las diferencias de diseño que he visto son (incluidas la mayoría de las combinaciones):

  • Habla directamente con la base de datos (2 niveles)
  • Utilice un backend que haya sido escrito para la aplicación determinada (3 niveles)
  • Utilice un conjunto de servicios web que fueron escritos para su uso en muchas aplicaciones y que no se pueden cambiar para su aplicación. (Arquitectura orientada a Servicios)
  • Actualizaciones realizadas por operaciones CRUD
  • Actualizaciones realizadas con el patrón de comando (envío de comandos al servidor backend)
  • Muchos usos del enlace de datos / ningún uso del enlace de datos
  • La mayoría de los datos son "similares a tablas" (por ejemplo, facturas) que funcionan bien en 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 se construye como está son la serie "Build Your Own CAB" de Jeremy D Miller . Después de trabajar, deberías poder comprender mucho mejor tus opciones. También se debe considerar la Guía de cliente inteligente de Microsoft (CAB/Bloque de aplicaciones compuestas de Microsoft) . Es un poco complejo, pero puede funcionar bien para aplicaciones que encajan bien.

Seleccionar una implementación MVC/MVP para un proyecto Winforms brinda una descripción general que vale la pena leer. A mucha gente le gusta PureMVC . Nunca lo he usado, pero lo miraré 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 usando "Presenter First", pero lo intentaré cuando tenga la oportunidad, ya que parece muy prometedor.

Otras preguntas sobre Stack Overflow que quizás desee consultar están aquí y aquí .

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

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


Pregúntese también por qué está utilizando MVC.

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

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

Ian Ringrose avatar Mar 25 '2009 15:03 Ian Ringrose

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

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

Un enfoque (que suelo adoptar) es dividir cada formulario de Windows en tres entidades:

  1. Una clase de presentador/controlador: esto es con lo que realmente se comienza al desarrollar un formulario. Aquí es donde debería residir la mayor parte o toda la lógica "comercial".
  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 sólo cuestión de agregar los controles apropiados al formulario y conectarlos a la interfaz.

Código de ejemplo (un pseudocódigo simple, solo a modo de 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 avatar Mar 26 '2009 13:03 Igor Brejc