Sto Attuare il modello MVP / Presentazione del modello di interfaccia utente in modo corretto?
-
26-09-2019 - |
Domanda
sto ri-lavorare un'applicazione WinForms e vorrebbe impiegare una variazione del pattern Presentazione Modello per l'interfaccia utente. Qualcuno potrebbe dirmi le seguenti spiegazioni se sto facendo in modo corretto?
Ho deciso di creare dipendenze nel seguente modo:
Model <---- Presentation Model <---- View
Questo è il seguente:
-
Il modello non è a conoscenza di nulla, se non per sé.
-
Il modello di presentazione ha un riferimento al modello (ma non viceversa).
-
La vista ha un riferimento al modello di presentazione (ma non viceversa).
Sto usando WinForms associazione dati per mantenere la vista e il modello di presentazione sincronizzata.
Ora questo tutti funziona come un fascino, tranne quando ho bisogno di trattare con per esempio Un clic su pulsante "Chiudi" di una maschera. Dal momento che il modello di presentazione non ha alcun riferimento alla vista, non può iscriversi a tutti gli eventi pubblicati dalla vista. Così mi è venuta in mente la seguente stampella:
Presentation Model View
+--+ +--+
| | | |
| | | <--------X closeButton.Click event fires
| | | |
| | +--------X |
| | CloseRequested = true | | |
| | +--------> |
| | | |
| | CloseRequested CloseRequested | |
| <-----------------------------------< |
| | | |
| X--------+ | |
| | | IsClosed = true | |
| <--------+ | |
| | | |
| | IsClosed MustClose | |
| >-----------------------------------> |
| | | |
| | | X--------> view.Close()
| | | |
+--+ +--+
Questo è il seguente:
-
L'utente fa clic sul pulsante "Chiudi".
-
evento
Click
del pulsante viene catturato nella vista, che reagisce impostando laCloseRequested
struttura. -
I dati vincolante trasferimenti questo valore a una proprietà corrispondente nel modello di presentazione.
-
La presentazione del modello reagisce a questo cambiamento impostando la sua
IsClosed
proprietà. -
I dati vincolante trasferimenti questo valore nella
MustClose
della vista. -
La visualizzazione reagisce a questo cambiamento di chiusura stessa.
Il modello di presentazione è molto ben disaccoppiato dalla vista, e viceversa, tuttavia questo è un sacco di lavoro solo per elaborare un singolo comando pulsante . C'è un modo più semplice, dato il grafo delle dipendenze che ho deciso di?
Soluzione
Ho recentemente nella trasformazione delle un'applicazione Windows Form all'architettura MVP, e sembra che hai configurato le dipendenze in un modo simile a quello che ho fatto. Tuttavia, Ho semplicemente un'interfaccia IPresenter
che definisce metodi per consentire la visualizzazione per trasmettere richieste degli utenti. Come la vista ha già una dipendenza dal presentatore e un riferimento ad esso, sembra ragionevole semplicemente chiamare metodi di richiesta su direttamente.
Quindi, nel mio sistema, gli ascolti Presenter per gli eventi dal modello e gli incendi i propri eventi di presentazione per qualsiasi vista interessati ad ascoltare fuori per. La vista risponde a tali eventi di per sé l'aggiornamento a seconda dei casi, e in avanti le richieste degli utenti per il presentatore quando sono fatte.
Altri suggerimenti
è solo la mia opinione.
Lavorare con modello di presentazione richiedono il supporto di interfaccia utente del 100% per l'associazione dati. Anche WPF non rendere l'azione più vicino Bindable. Un sacco di cose non funzionando senza intoppi nel modello di presentazione, come MessageBox conferma. anche esso può essere astratto con l'interfaccia del presentatore, ma non fa ancora buon gusto e semplicità è sacrificato.
con l'altra mano, gli scopi principali del modello di presentazione è quello di testare The View Logic. In alcuni casi, se il vostro "Chiudi azione" dovrebbe essere testato unità a causa di v'è una certa logica prima che sia vicino, allora il codice è l'unica scelta. ma se è solo una semplice conferma "Sei sicuro di voler uscire" allora è meglio mettere che sul View non nel modello di presentazione perché non è richiede di unit test.
La vista ha un riferimento al modello di presentazione (ma non il vizio versa).
Per quanto ne sappia la presentazione dovrebbe avere una refference alla visualizzazione più precisamente di interfacciarsi IView in modo che la coppia doesnt presentazione con visione concreta. Poi in classe di presentazione si può chiamare i metodi di visualizzazione e iscriversi per visualizzare gli eventi tramite IView.