2009-03-17 18 views
99

Dove posso trovare un buon esempio su come implementare completamente il pattern MVC in Windows Form?Implementazione di MVC con Windows Form

Ho trovato molti tutorial ed esempi di codice su vari siti (ad esempio, The Code Project e. NetHeaven), ma molti sono più rappresentativi per il modello di osservatore di MVC. Poiché l'applicazione che voglio sviluppare è per un progetto scolastico, sono riluttante a utilizzare framework come PureMVC o MVC#.

+1

possibile duplicato di [? Come si implementa MVC in un'applicazione WindowsForms] (http://stackoverflow.com/questions/ 122388/how-would-you-implement-mvc-in-a-windowsforms-application) – nawfal

+1

vedere anche [Come rendere sicuro il tipo di Databinding e supportare il refactoring] (http://stackoverflow.com/questions/1329138/how-to -make-databinding-type-safe-and-support-refactoring) –

risposta

109

Sono del parere che le applicazioni siano così diverse l'una dall'altra e la nostra comprensione di come devono essere scritte le applicazioni è ancora molto limitata. Le applicazioni Windows Form precedenti su cui ho lavorato sono state così diverse l'una dall'altra. Alcune delle differenze di progettazione che ho visto sono (tra cui la maggior parte delle combinazioni):

  • Direttamente parlare al database (2 livello)
  • Utilizzare un back-end che è stato scritto per una data applicazione (3 livelli)
  • Utilizzare un set di servizi Web che sono stati scritti per essere utilizzati da molte applicazioni e non possono essere modificati per l'applicazione. (Service-Oriented Architecture)
  • Aggiornamenti stato fatto da CRUD operazioni
  • Aggiornamenti stato fatto con i (l'invio di comandi al server back-end) command pattern
  • sacco di usi di data binding/no usi di associazione dati
  • maggior parte dei dati essere "simili a tabelle" (ad es. fatture) che funzionano bene nei controlli griglia standard/richiedono controlli personalizzati per la maggior parte dei dati dell'interfaccia utente.
  • Uno sviluppatore/gruppi di 10 o 20 sviluppatori (solo sull'interfaccia utente)
  • Un sacco di test di unità utilizzando deride etc/nessuna unità mette alla prova

Quindi non credo che sia possibile creare un'implementazione di MVC (o MVP) che si adatta sempre bene.

I migliori post che ho visto davvero spiegando MVC e perché un sistema MVC è costruito così com'è, è la "Build Your Own CAB" series by Jeremy D Miller. Dopo aver lavorato, dovresti essere in grado di capire le tue opzioni molto meglio. Microsoft's Smart Client Guidance (CAB/Microsoft Composite Application Block) dovrebbe anche essere considerato. È un po 'complesso, ma può funzionare bene per le applicazioni che si adattano bene.

La selezione di un MVC/MVP Implementation for a Winforms Project fornisce una panoramica che vale la pena di leggere. Un sacco di persone come PureMVC. Non l'ho mai usato, ma lo guarderei la prossima volta che ho bisogno di un framework MVC.

"Presenter First" è un approccio di sviluppo software che combina le idee del modello di progettazione Model View Presenter (MVP) e test-driven development. Ti consente di iniziare scrivendo i test nella lingua del cliente. Per esempio:

"Quando si fa clic sul pulsante 'salva' quindi il file deve essere salvato e l'avvertimento file non salvato dovrebbe sparire“.

non ho alcuna esperienza con "Presenter First ", ma darò una prova quando ho la possibilità, come sembra molto promettente.

Altre domande overflow dello stack   si potrebbe potrebbe desiderare di guardare sono here e here.

Se state pensando di usare WPF in qualsiasi momento date un'occhiata al modello Model-View ViewModel (MVVM). Ecco un ottimo video che dovresti dare un'occhiata a: Jason Dolinger on Model-View-ViewModel.

MVVM (Model View View Model) Design Pattern for Winforms fornire un'altra opzione che potrebbe rendere più semplice la conversione in WPF, se necessario. Magical.Trevor è un altro esempio MVVM per Windows Form che include anche l'associazione automatica basata sui nomi di proprietà.


Anche chiedere se stessi perché si utilizza MVC.

  • Desiderate essere in grado di testare più codice possibile?
  • Stai cercando di consentire il maggior numero possibile di codice da riutilizzare?
  • Stai cercando di rendere facile la comprensione del codice?
  • 101 altri motivi che possono essere validi per un determinato progetto.

volta che sono chiare sul mira, diventa più facile scegliere un'implementazione o l'altro.

+0

Che cos'è questo "CAB"? –

+0

@AgnelKurian, il CAB era un set di codice di esempio di Microsoft su come creare app: ora è principalmente cronologia. –

+0

Haha! Sì, ora ricordo quei "blocchi applicativi". –

6

Hai guardato PureMVC? Ho scoperto che nessuno può essere d'accordo su cosa sia realmente l'MVC una volta che iniziano a costruire un'implementazione specifica.

Aggiornamento: è possibile creare il proprio iniziando con qualcosa di più semplice come MobileMVC. Il codice Compact Framework dovrebbe compilare/eseguire OK su Windows. Poiché si tratta di un incarico scolastico, ti suggerisco di dedicare del tempo a imparare come funziona realmente MVC.

+0

Ho un compito scolastico per un'applicazione molto semplice per gestire un negozio di libri, e sono piuttosto riluttante all'utilizzo di un framework come PureMVC. Sto cercando qualcosa di più semplice. – kjv

3

Si potrebbe voler dare un'occhiata a Differential Execution.

Qui è in SourceForge

IMO, si tratta di un grande miglioramento su MVC, anche se è ancora abbastanza inusuale.

2

Un buon esempio di rotazione della propria implementazione di MVC utilizzando Windows Form può essere trovato here. Il codice sorgente è incluso

Mentre leggi, studi e scrivi il codice per questo compito scoprirai che ci sono molte divergenze su come implementare MVC. Questo è un caso semplice che riflette la separazione delle preoccupazioni e un buon esempio di "impianto idraulico" necessario per collegare questo.

Quando sei fuori da scuola, probabilmente vorrai ricorrere a una struttura come gli altri poster hanno raccomandato.

2

Il blocco applicazione Microsoft Composite Interface ha iniziato la sua vita come implementazione MVC (tra gli altri modelli implementati). La versione di rilascio, tuttavia, si è evoluta in un'implementazione MVP, che può essere considerata una specie di interpretazione diversa del concetto MVC.

Se si desidera verificare il codice di un'implementazione MVP molto completa (e in qualche modo complessa), è possibile trovare MS-CAB come uno dei componenti di Microsoft Smart Client Software Factory. Viene fornito con il codice sorgente. Lo puoi trovare here. In bocca al lupo!

43

UPDATE: Oltre alla mia precedente risposta di seguito, vi suggerisco di leggere sui "Presenter First" approach (specialmente gli articoli in formato PDF)

lo consiglio MVP (modello PassiveView in realtà) al posto di MVC. Non hai davvero bisogno di quadri speciali per questo, è solo come si organizza il codice.

Un approccio (che di solito prendo) è quello di dividere ogni Windows Form in tre entità:

  1. Una classe presentatore/regolatore - questo è quello di iniziare la durante lo sviluppo di un modulo. Qui è dove risiede la maggior parte/tutta la tua logica "aziendale".
  2. Un'interfaccia di visualizzazione (IView), che contiene i metodi, le proprietà e gli eventi. Questa interfaccia è all che il relatore conosce il tuo modulo.
  3. Al termine, quando si completa l'implementazione del relatore e della vista (inclusi i test di unità), è quindi possibile creare la classe modulo effettiva e implementare l'interfaccia IView. Quindi si tratta solo di aggiungere controlli appropriati al modulo e di collegarli all'interfaccia.

codice di esempio (un semplice pseudocodice, solo per l'illustrazione):

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

Questa è un'implementazione della variante MVP chiamata PassiveView. Nella vista passiva la vista non dovrebbe essere scelta dal suo presentatore. Per un esempio simile (ma con una vista VERAMENTE passiva) controlla questo esempio http://www.danieleteti.it/?p=221 (esempio in lingua Delphi) –