8

Quando Jeremy & Chad posted about their FubuMvc project, uno degli elementi di differenziazione hanno menzionato era la loro "Thunderdome Principale":Thunderdome MVC- Perché one-model-in in MVC?

Il “Thunderdome Principle” - Tutti metodi controller prendono in uno oggetto ViewModel (o pari a zero oggetti in alcuni casi) e restituire un singolo oggetto ViewModel (un oggetto entra, lascia un oggetto). Le classi Controller non saranno MAI direttamente esposte a qualsiasi cosa relativa a HttpContext. Nulla mi fa piangere come vedere persone che provano a scrivere test che simulano lo o che stub quella nuova interfaccia IHttpContextWrapper . Allo stesso modo, i metodi Controller non restituiscono oggetti ViewResult e sono generalmente disaccoppiati da tutta l'infrastruttura MVC. Noi abbiamo adottato questa strategia molto presto come un modo per rendere più semplice il test del controller. È sicuramente lo raggiunto questo obiettivo, ma è anche reso il codice del Controller molto semplificato e di facile lettura. Spiegheremo come funziona in KaizenConf.

Qual è il vantaggio della loro 'una ViewModel (o zero) in' approccio?

risposta

9

Il suo principale vantaggio è che è una convenzione e rende le cose coerenti in tutti i nostri controllori. Semplifica la configurazione di test "contesti"/fixture che possono inizializzare l'ambiente in uno scenario di test di integrazione. Nella maggior parte dei casi, Convenzioni == Rapidità in quanto rimuove molti scenari "what if" dalle considerazioni di progettazione.

Poiché tutte le azioni del controller seguono lo stesso schema, possiamo assumere molte cose e accelera e semplifica le attività di test integrate del controller.

Non c'è niente di sbagliato, necessariamente, con avere più argomenti per un'azione del controller, ma abbiamo scoperto che avere un oggetto modello reale ci offre alcune funzionalità extra dal momento che il modello può contenere logica semplice ed esporre proprietà di convenienza che possono semplicemente alcune delle aspetti più complessi del suo stato, ecc. In pratica, questo è l'argomento per avere un modello ricco e non è univoco per il modello Thunderdome/OMIOMO.

+0

Ok, posso sicuramente comprare i benefici di essere solo una convenzione. Darò a questo modello uno scatto su uno dei miei prossimi progetti. – Troy

+0

Avere 16 parametri per tutti i controller è anche una convenzione. La convenzione da sola non è necessariamente una buona cosa. – liammclennan

+0

@liamclennan Questo è corretto. Le convenzioni intelligenti potrebbero essere un modo migliore per descriverlo. Per fortuna nessuno stava promuovendo convenzioni stupide, ma grazie per averlo sottolineato :) – chadmyers

0

Il vantaggio è che non si fa affidamento su alcun tipo di contesto (ad esempio lo stato della sessione, ad esempio) esterno ai metodi del controller. Questo rende più facile testarli, dato che non devi "simulare" quel contesto usando i mock, ma lo rende anche meno pratico dato che devi passare tutto tramite parametri.

+0

Sicuramente comprendo che dover simulare contesti e simili durante il test del controller è un dolore, ma penso che questo tipo di dolore possa essere facilitato usando DI. Non riesco ancora a capire come ogni azione abbia un solo parametro utile. Non stai quindi trasferendo gli stessi problemi di test al modello? – Troy

+0

Non ritengo che avere "un ViewModel (o zero) in" significa che è possibile avere solo un parametro. Penso che tu possa averne due, o anche di più. La mia interpretazione è che il metodo Action non prende nulla dall'esterno della classe Controller, come il contesto Http. È così che l'ho letto. –

+0

@Dave: No, l'intenzione con Thunderdome/OMIOMO è di avere uno o zero argomenti di input per il metodo in cui l'argomento è un modello ricco (invece di una primitiva) che rappresenta la richiesta di azione in modo pieno – chadmyers

0

Il vantaggio del principio thunderdome è che semplifica i controllori. Poiché il lavoro di mappare i valori http agli oggetti viene eseguito al di fuori dei controller, significa che i controller fanno solo ciò che dovrebbero.

+0

I modelbinders mappano i valori http ai parametri di azione all'esterno del controller, no? – Troy

+0

Davvero non penso che semplifichi il tuo design. Probabilmente semplifica i controller, ma dovrai elaborarlo da qualche parte. –

+0

Troy ha ragione che Modelbinders farà il sollevamento per voi, ma non possono necessariamente gestire alcune situazioni in cui la logica potrebbe essere richiesta. Questo di solito cade sul controller. Con Thunderdome/OMIOMO è nel modello di input – chadmyers