Sto cercando di capire come deve essere implementato MVP al livello UserControl
. Pensavo di averlo fatto, ma alla fine ho letto un post sul blog che mi ha praticamente bloccato. Ora sono tornato all'inizio e non ho idea di come procedere.
Diciamo che il mio UserControl
è qualcosa di semplice come due TextBox
es e un ComboBox
. Questo viene richiamato da un modulo principale (che ha una propria View e Presenter). Ora, il modo in cui comprendo MVP è che il Main Form Presenter deve richiamare un secondo relatore per gestire tutte le comunicazioni con UserControl che viene rilasciato lì.
Ed è qui che mi sento completamente perso. Le mie implementazioni precedenti di UserControl
s (prima che apprendessi MVP) incorporavano sempre la logica dietro il controllo (ad esempio la selezione ComboBox
cambierà l'etichetta di testo relativa a TextBox1
). Pertanto, l'implementazione di UserControl
viene eseguita trascinandola sul designer e quindi chiamando comandi come UserControl1.Update()
o UserControl1.DisplayData(data)
.
In qualsiasi% di terze parti% co_de, tutti i comandi a UserControl
vengono eseguiti dai comandi al controllo. Non esiste un "presentatore" che deve essere invocato, ad esempio, quando rilascio un UserControl
o un ComboBox
o qualsiasi altro controllo WinForms sul mio modulo. Tuttavia hanno una logica interna che determina come vengono visualizzati e, nella sostanza del testing, dovrebbe avere una separazione "presentatore" su di esso da qualche parte .
I ho pensato che una buona soluzione sarebbe che il costruttore del mio ListView
avrebbe creato un Presenter. Qualsiasi comando verso UserControl
verrà delegato direttamente al Presenter. Ciò consentirebbe al mio UserControl
di avere la propria logica di presentazione separata dalla sua "vista", in modo tale che io possa testarla e in modo tale che l'implementatore (il modulo principale) debba solo rilasciare il UserControl
ed eseguire riceve come parte della sua logica di presentazione locale. UserControl
ha la sua logica di presentazione lasciata invisibile all'implementatore.
E proprio quando pensavo di aver capito tutto, scopro che è una cattiva pratica (The Self -Aware View) . Quindi supplico le persone che lo capiscono meglio di me: come faccio a costruire un UserControl
che mantenga la logica di presentazione invisibile all'utente finale, così che non debba costruire il presentatore di wrapping nel mio Main Form, < strong> senza violare i principi che Matt Wynne discute nel post collegato sopra?
O sto completamente fraintendendo il concetto di MVP qui?