Implementazione di MVC con Windows Form


102

Dove posso trovare un buon esempio su come implementare completamente il pattern MVC in Windows Forms?

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 osservazione rispetto a MVC. Poiché l'applicazione che desidero sviluppare è per un progetto scolastico, sono riluttante a utilizzare framework come PureMVC o MVC # .



Risposte:


115

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

  • Parla direttamente al database (2 livelli)
  • Utilizza un backend che è stato scritto per l'applicazione data (3 livelli)
  • Utilizza una serie di servizi Web che sono stati scritti per essere utilizzati da molte applicazioni e non possono essere modificati per la tua applicazione. (Architettura orientata ai servizi)
  • Aggiornamenti eseguiti dalle operazioni CRUD
  • Aggiornamenti eseguiti con il modello di comando (invio di comandi al server di backend)
  • Molti utilizzi del data binding / nessun utilizzo del data binding
  • La maggior parte dei dati è "simile a una tabella" (ad es. Fatture) che funzionano bene nei controlli della griglia standard / richiedono controlli personalizzati per la maggior parte dei dati dell'interfaccia utente.
  • Uno sviluppatore / team di 10 o 20 sviluppatori (solo sull'interfaccia utente)
  • Un sacco di unit test utilizzando mock ecc / nessun unit test

Pertanto non penso sia possibile creare un'implementazione di MVC (o MVP) che si adatti sempre bene.

I migliori post che ho visto che spiegano veramente MVC e perché un sistema MVC è costruito così com'è, è la serie "Build Your Own CAB" di Jeremy D Miller . Dopo averlo lavorato dovresti essere in grado di capire molto meglio le tue opzioni. Dovrebbe essere presa in considerazione anche la guida per smart client di Microsoft (CAB / blocco di applicazioni composite Microsoft) . È un po 'complesso, ma può funzionare bene per applicazioni che si adattano bene.

La selezione di un'implementazione MVC / MVP per un progetto Winforms fornisce una panoramica che vale la pena leggere. A molte persone piace PureMVC . Non l'ho mai usato, ma lo guarderei la prossima volta che avrò 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 lo sviluppo basato sui test . Ti consente di iniziare scrivendo test nella lingua del cliente. Per esempio:

"Quando faccio clic sul pulsante" Salva ", il file dovrebbe essere salvato e l'avviso relativo al file non salvato dovrebbe scomparire."

Non ho esperienza nell'uso di "Presenter First", ma ci proverò quando ne avrò la possibilità, poiché sembra molto promettente.

Altre domande su Stack Overflow che potresti voler esaminare sono qui e qui .

Se stai pensando di utilizzare WPF in qualsiasi momento, dai un'occhiata al pattern Model-View ViewModel (MVVM) . Ecco un ottimo video a cui dovresti dare un'occhiata: Jason Dolinger su Model-View-ViewModel .

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


Chiediti anche perché stai usando MVC.

  • Vuoi essere in grado di testare quanto più codice possibile?
  • Stai cercando di riutilizzare quanto più codice possibile?
  • Stai cercando di rendere la tua base di codice facile da capire?
  • 101 altre ragioni che possono essere valide per un dato progetto.

Una volta che hai chiarito i tuoi obiettivi , diventa più facile scegliere un'implementazione o un'altra.


@AgnelKurian, il CAB era un insieme di codice di esempio di Microsoft su come creare app: ora è principalmente storia.
Ian Ringrose

Haha! Sì, ora ricordo quei "Blocchi applicazione".
Agnel Kurian

45

AGGIORNAMENTO: Oltre alla mia precedente risposta di seguito, suggerisco di leggere sull'approccio "Presenter First" (in particolare gli articoli PDF)

Consiglierei MVP (modello PassiveView in realtà) invece di MVC. Non hai davvero bisogno di framework speciali per questo, è solo come organizzi il tuo codice.

Un approccio (che di solito adotto) è quello di dividere ogni windows form in tre entità:

  1. Una classe presentatore / controllore: questo è ciò con cui inizi effettivamente quando sviluppi un modulo. Qui è dove dovrebbe risiedere la maggior parte / tutta la logica "aziendale".
  2. Un'interfaccia di visualizzazione (IView), che contiene i metodi, le proprietà e gli eventi. Questa interfaccia è tutto ciò che il presentatore sa del tuo modulo.
  3. Alla fine, quando hai finito di implementare il presenter e la vista (inclusi gli unit test), puoi creare la classe del form effettiva e far sì che implementa l'interfaccia IView. Quindi è solo questione di aggiungere controlli appropriati al modulo e collegarli all'interfaccia.

Codice di esempio (un semplice pseudocodice, solo a scopo illustrativo):

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 denominata PassiveView. Nella vista passiva la vista non dovrebbe scegliere il suo presentatore. Per un esempio simile (ma con un'ottica DAVVERO passiva) controlla questo campione danieleteti.it/?p=221 (esempio in lingua Delphi)
Daniele Teti

6

Hai guardato PureMVC ? Ho scoperto che nessuno può essere d'accordo su come appare realmente MVC una volta che inizia a costruire un'implementazione specifica.

Aggiornamento: potresti crearne uno tuo partendo da qualcosa di più semplice come MobileMVC . Il codice Compact Framework dovrebbe essere compilato / eseguito correttamente su Windows. Poiché si tratta di un compito scolastico, ti suggerirei di dedicare un po 'di tempo a imparare come funziona effettivamente MVC.


Ho un compito scolastico per un'applicazione molto semplice per gestire una libreria e sono piuttosto riluttante a utilizzare un framework come PureMVC. Sto cercando qualcosa di più semplice.
kjv


2

Un buon esempio per eseguire il rollio della propria implementazione di MVC utilizzando Windows Form può essere trovato qui . Il codice sorgente è incluso.

Mentre leggi, studi e scrivi codice per questo compito, scoprirai che ci sono molti disaccordi su come dovrebbe essere implementato MVC. Questo è un caso semplice che riflette la separazione delle preoccupazioni, nonché un buon esempio di "impianto idraulico" necessario per collegarlo.

Quando finisci la scuola probabilmente vorrai ripiegare su un quadro come gli altri poster hanno consigliato.


2

Il blocco Microsoft Composite Interface Application 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 sorta di interpretazione diversa del concetto MVC.

Se sei disposto a controllare il codice di un'implementazione MVP molto completa (e in qualche modo complessa), puoi trovare MS-CAB come uno dei componenti di Microsoft Smart Client Software Factory. Viene fornito con il codice sorgente. Puoi trovarlo qui . In bocca al lupo!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.