Sto Attuare il modello MVP / Presentazione del modello di interfaccia utente in modo corretto?

StackOverflow https://stackoverflow.com/questions/3435834

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 la CloseRequested 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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top