Mauro Servienti
Model View ViewModelIn medio stat virtus
Microsoft MVP - Visual C#Senior Software Architecht @ Gaia
http://milestone.topics.it/[email protected]
Agenda
• Preambolo...• Overview• Anatomia• Magagne :-)
M-V-VM: PREAMBOLOQualche cosa dobbiamo dircela...
Domandoni... :-)
• Che cosa ci deve far paura e perchè?– static...– new...– ServiceProvider.GetService<T>();
• Cosa è Dependency Injection?• Cosa è Inversion of Control?
static
• Come lo testiamo?– E se mantiene uno stato?
• Se vogliamo cambiare il comportamento?
new
• Come lo testiamo?• Se vogliamo cambiare il comportamento?
Dependency Injection
• lo testiamo :-) Mock to the max!• Iniettiamo tutti i comportamenti che vogliamo– Può essere fatta via «ctor» o via «prop»
• Optional vs Mandatory
Inversion of Control (1)• Qualcuno un giorno sentenziò:– Luke: program to an interface... Mumble mumble...
• Ok, va bene, bello, figo, ma...: «new» is evil :-)
Inversion of Control (2)• Deleghiamo il lavoro sporco! Tanto abbiamo
capito cosa è DI;
Please, welcome «ServiceProvider»• Activator.CreateInstance(): la preistoria di IoC• Fx 1.0: IServiceProvider.GetService( Type svc );• Perchè?– Lifetime!!!!
• Gli errori da non commettere:– DI diretta sul container;– «ServiceLocator» pattern... Blehaha...: è static;
• Il container è uno sconosciuto e tale deve restare :-)
M-V-VM: OVERVIEWTutti ne parlano... Ma che cosa è?
Il centro del mondo!
Please welcome M-V-VM
Somewhere in time...
ViewModel
Repository<T>
D.I.
View
DataBinding
Command presentatio
nengine
data
Model
Adapter
Overview
• mediatore della comunicazione;• Il designer non deve scrivere codice;• sfrutta il potentissimo motore di DataBinding e di
Commanding di Wpf;• permette di «appiattire» un grafo, la UI è piatta!• aggiunta di behavior ad un grafo:
– e.g. Delete command su una row;• aggiunta di informazioni ad un grafo:
– e.g. proprietà calcolate, che non avrebbero senso sul dominio;• semplificazione dello xaml perchè può ridurre
drasticamente l'uso dei converter;
M-V-VM: ANATOMIASmontiamolo :-)
Anatomia
• È una banale classe che implementa INotifyPropertyChanged e basta! :-)
• Si potrebbe essere tentati di dipendere da DependencyObject– ma introduciamo una dipendendenza da tutto Wpf
al solo scopo di avere la notifica simile a INotifyPropertyChanged
ITALIANI! FACCIAMOLO...Demo
Anatomia: considerazioni
• View first o ViewModel first?– La blendability è importante;– Come comunicano View e ViewModel:• Uno per tutti: Intercettare la chiusura della View
• In ottica DI se il ViewModel ha delle dipendenze mandatory la View first ve la siete giocata;
• A questo punto DI ci porta verso IoC quindi è necessariamente ViewModel first;
Pregi & Difetti
• + Testabilità della logica della UI;• + Sostituibilità della UI (stesso View Engine);• + Elevata manutenibilità;
• - Aumento della complessità e mancanza di “controllori” (San csc.exe non aiuta...);
• - il data binding non risolve tutti gli scenari... dobbiamo sporcarci le manine...
M-V-VM: MAGAGNEBello... ma che sudate!
Non è tutto oro quel che luccica
• Passate la vita a scrivere wrapper/dto;• Il processo di validazione: IDataErrorInfo.
– Ma come «triggheriamo»?• Localizzazione: LocBAML... Ahahah che ridere;• è produttivo? Dipende da vostro concetto di produttività:
– pessimo supporto dei designer visuali;– struttura della solution obbliga alla rebuild;– possiamo testare tutto, quasi;– Elevatissima manutenibilità;
• è performante? Si, ma che importa? :-)
VEDIAMO UN PO’ DI SOLUZIONI...See it: live!
DOMANDISSIME...?Metto le cuffie :-)