Come implementeresti MVC in un’applicazione Windows Form?

Non sviluppo troppe applicazioni desktop / Windows Form, ma mi è venuto in mente che potrebbero esserci dei vantaggi nell’utilizzo del pattern MVC (Model View Controller) per lo sviluppo di Windows Form .NET.

Qualcuno ha implementato MVC in Windows Form? Se sì, hai qualche consiglio sul design?

Quello che ho fatto in passato è usare qualcosa di simile, Model-View-Presenter .

[NOTA: questo articolo era disponibile sul web. Per vederlo ora, è necessario scaricare il CHM, quindi visualizzare le proprietà del file e fare clic su Sblocca. Quindi puoi aprire il CHM e trovare l’articolo. Grazie mille, Microsoft! sospiro ]

Il modulo è la vista e ho un’interfaccia IView per questo. Tutto il processo avviene nel presentatore, che è solo una class. Il modulo crea un nuovo presentatore e passa a se stesso come IView del relatore. In questo modo, per il test, è ansible passare invece in una IView falsa, quindi inviare comandi dal presentatore e rilevare i risultati.

Se dovessi usare un Model-View-Controller completo, credo che lo farei in questo modo:

  • La forma è la vista . Invia comandi al modello, genera eventi a cui il controllore può iscriversi e si iscrive agli eventi dal modello.
  • Il controller è una class che si abbona agli eventi della vista e invia comandi alla vista e al modello.
  • Il modello solleva gli eventi a cui la vista si abbona.

Questo si adatterebbe con il classico diagramma MVC . Il più grande svantaggio è che con gli eventi, può essere difficile dire chi si abbona a cosa. Lo schema MVP utilizza metodi anziché eventi (almeno il modo in cui l’ho implementato). Quando la forma / vista genera un evento (es. SomeButton.Click), il modulo chiama semplicemente un metodo sul relatore per eseguire la logica per esso. La vista e il modello non hanno alcuna connessione diretta; entrambi devono passare attraverso il presentatore.

Bene, in realtà Windows Form implementa una versione “free-style” di MVC, proprio come alcuni film implementano una pessima interpretazione “free-style” di alcuni libri classici (Romeo & Juliet vengono in mente).

Non sto dicendo che l’implementazione di Windows Form è brutta, è solo … diversa.

Se utilizzi Windows Form e le tecniche OOP appropriate e forse un ORM come EntitySpaces per l’accesso al tuo database, allora potresti dire che:

  1. L’infrastruttura ORM / OOP è il modello
  2. I moduli sono le viste
  3. I gestori di eventi sono il controller

Sebbene avere sia View che Controller rappresentati dallo stesso object rendono il codice di separazione dalla rappresentazione molto più difficile (non esiste un modo semplice per inserire una “vista GTK +” in una class derivata da Microsoft.Windows.Forms.Form).

Cosa puoi fare, se sei abbastanza attento. È mantenere il codice del modulo completamente separato dal codice del controller / modello solo scrivendo cose relative alla GUI nei gestori di eventi e tutte le altre logiche di business in una class separata. In tal caso, se si desidera utilizzare GTK + per scrivere un altro livello di visualizzazione, è necessario solo riscrivere il codice GUI.

Windows Form non è progettato da zero per utilizzare MVC. Hai due opzioni.

Innanzitutto, puoi eseguire il rollover della tua implementazione di MVC.

In secondo luogo, è ansible utilizzare un framework MVC progettato per Windows Form.

Il primo è semplice da iniziare, ma più si ottiene, più è complesso. Suggerirei di cercare un framework MVC valido, preesistente e ben collaudato, progettato per funzionare con Windows Form. Credo che questo post sul blog sia un buon punto di partenza.

Per chiunque inizi, suggerirei di saltare Windows Form e lo sviluppo contro WPF, se ne hai l’opzione. È un framework molto migliore per la creazione dell’interfaccia utente. Ci sono molti framework MVC in fase di sviluppo per WPF, inclusi questo e quello .

Secondo Microsoft, il blocco dell’applicazione UIP menzionato da @jasonbunting è “archiviato”. Invece, guarda lo Smart Client Application Block o lo Smart Client Software Factory ancora più recente, che supporta sia WinForms sia WPF SmartParts.

Controllare nel blocco applicazione UIP (User Interface Process) . Non ne so molto, ma l’ho guardato qualche anno fa. Ci possono essere versioni più recenti, controllare.

“Il blocco applicativo UIP si basa sul pattern model-view-controller (MVC).”

Dai uno sguardo al blocco applicativo MS Patterns and Practices Smart Client che ha alcune linee guida e lezioni che ti guidano attraverso l’implementazione di un modello di presentazione di modelli in forms di windows – dai un’occhiata all’applicazione di riferimento inclusa.

Per WPF questo è stato superato dal progetto prisma

L’approccio delle fabbriche di software è un ottimo modo per apprendere le migliori pratiche