2009-03-17 22 views
99

¿Dónde puedo encontrar un buen ejemplo sobre cómo implementar completamente el patrón MVC en Windows Forms?Implementación de MVC con 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. Como la aplicación que deseo desarrollar es para un proyecto escolar, soy reacio a utilizar marcos como PureMVC o MVC#.

+1

posible duplicado de [? ¿Cómo aplicar MVC en una aplicación WindowsForms] (http://stackoverflow.com/questions/ 122388/how-you-you-implementation-mvc-in-a-windowsforms-application) – nawfal

+1

vea también [Cómo hacer seguro el tipo de enlace de datos y soporte de la refactorización] (http://stackoverflow.com/questions/1329138/how-to -make-databinding-type-safe-and-support-refactoring) –

Respuesta

109

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 (incluyendo la mayoría de las combinaciones):

  • hablar directamente a la base de datos (nivel 2)
  • utilice un motor que se ha escrito para la aplicación dada (nivel 3)
  • 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 siendo hecho por CRUD operaciones
  • actualizaciones está haciendo con los (envío de comandos al servidor back-end) command pattern
  • montón de usos de data binding/no usos de enlace de datos
  • mayoría de los datos ser "similar a una mesa" (por ejemplo, facturas) que funcionan bien en controles de cuadrícula estándar/necesitan controles personalizados para la mayoría de los datos de UI.
  • Un desarrollador/equipos de 10 o 20 desarrolladores (sólo en la interfaz de usuario)
  • Las porciones de prueba de la unidad utilizando burla etc/sin unidad de tests

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

Los mejores mensajes que he visto realmente explicar MVC y qué un sistema MVC se construye la forma en que es, es el "Build Your Own CAB" series by Jeremy D Miller. Después de trabajar, deberías poder entender tus opciones mucho mejor. Microsoft's Smart Client Guidance (CAB/Microsoft Composite Application Block) también se debe considerar. Es un poco complejo, pero puede funcionar bien para aplicaciones que se ajustan bien.

Seleccionando MVC/MVP Implementation for a Winforms Project da una visió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 test-driven development. Le permite comenzar escribiendo pruebas en el idioma del cliente. Por ejemplo:

"Al hacer clic en el botón 'Guardar' y luego el archivo debe ser guardado y la advertencia archivo no guardado debe desaparecer“.

tengo ninguna experiencia en el uso "Presentador Primera ," pero voy a darle una oportunidad cuando llegue la oportunidad, ya que parece muy prometedor.

Otros Stack Overflow   preguntas es posible que puede desea ver son here y here.

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

MVVM (Model View View Model) Design Pattern for Winforms ofrecen 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 el enlace automático basado en nombres de propiedad.


También hágase qué está utilizando MVC.

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

vez que esté claro en su pretende, se hace más fácil elegir una aplicación u otra.

+0

¿Qué es este "CAB"? –

+0

@AgnelKurian, el CAB era un conjunto de código de muestra de Microsoft sobre cómo crear aplicaciones; ahora es en su mayoría historia. –

+0

¡Jaja! Sí, recuerdo esos "bloques de aplicaciones" ahora. –

6

¿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 compilar/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.

+0

Tengo una asignación de escuela para una aplicación muy simple para administrar una librería, y soy bastante reacio a usar un framework como PureMVC. Estoy buscando algo más simple. – kjv

2

Un buen ejemplo de cómo implementar su propia MVC utilizando Windows Forms se puede encontrar en here. El código fuente está incluido.

Mientras lee, estudia y escribe 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 'fontanería' necesaria para conectar esto.

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

2

Microsoft Composite Interface El bloque de aplicaciones comenzó su vida como una implementación de MVC (entre otros patrones implementados). 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 la MS-CAB como uno de los componentes de Microsoft Smart Client Software Factory. Viene con el código fuente. Puede encontrarlo here. ¡Buena suerte!

43

ACTUALIZACIÓN: Además de mi respuesta anterior a continuación, sugiero la lectura sobre los "Presenter First" approach (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 por lo general tomo) es dividir cada forman ventanas en tres entidades:

  1. Una clase presentador/controlador - esto es lo que en realidad comienza con la hora de desarrollar una forma. 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 todas que el presentador conoce acerca de 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.

Ejemplo de código (un pseudocódigo simple, sólo 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; 
} 
+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 un ejemplo similar (pero con una vista REALMENTE pasiva), consulte esta muestra http://www.danieleteti.it/?p=221 (ejemplo en lenguaje Delphi) –