m-v-vm @ dotNetMarche

22
Mauro Servienti Model View ViewModel In medio stat virtus Microsoft MVP - Visual C# Senior Software Architecht @ Gaia http://milestone.topics.it/ [email protected]

description

m-v-vm @ dotNetMarche

Transcript of m-v-vm @ dotNetMarche

Page 1: m-v-vm @ dotNetMarche

Mauro Servienti

Model View ViewModelIn medio stat virtus

Microsoft MVP - Visual C#Senior Software Architecht @ Gaia

http://milestone.topics.it/[email protected]

Page 2: m-v-vm @ dotNetMarche

Agenda

• Preambolo...• Overview• Anatomia• Magagne :-)

Page 3: m-v-vm @ dotNetMarche

M-V-VM: PREAMBOLOQualche cosa dobbiamo dircela...

Page 4: m-v-vm @ dotNetMarche

Domandoni... :-)

• Che cosa ci deve far paura e perchè?– static...– new...– ServiceProvider.GetService<T>();

• Cosa è Dependency Injection?• Cosa è Inversion of Control?

Page 5: m-v-vm @ dotNetMarche

static

• Come lo testiamo?– E se mantiene uno stato?

• Se vogliamo cambiare il comportamento?

Page 6: m-v-vm @ dotNetMarche

new

• Come lo testiamo?• Se vogliamo cambiare il comportamento?

Page 7: m-v-vm @ dotNetMarche

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

Page 8: m-v-vm @ dotNetMarche

Inversion of Control (1)• Qualcuno un giorno sentenziò:– Luke: program to an interface... Mumble mumble...

• Ok, va bene, bello, figo, ma...: «new» is evil :-)

Page 9: m-v-vm @ dotNetMarche

Inversion of Control (2)• Deleghiamo il lavoro sporco! Tanto abbiamo

capito cosa è DI;

Page 10: m-v-vm @ dotNetMarche

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 :-)

Page 11: m-v-vm @ dotNetMarche

M-V-VM: OVERVIEWTutti ne parlano... Ma che cosa è?

Page 12: m-v-vm @ dotNetMarche

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

Page 13: m-v-vm @ dotNetMarche

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;

Page 14: m-v-vm @ dotNetMarche

M-V-VM: ANATOMIASmontiamolo :-)

Page 15: m-v-vm @ dotNetMarche

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

Page 16: m-v-vm @ dotNetMarche

ITALIANI! FACCIAMOLO...Demo

Page 17: m-v-vm @ dotNetMarche

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;

Page 18: m-v-vm @ dotNetMarche

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...

Page 19: m-v-vm @ dotNetMarche

M-V-VM: MAGAGNEBello... ma che sudate!

Page 20: m-v-vm @ dotNetMarche

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? :-)

Page 21: m-v-vm @ dotNetMarche

VEDIAMO UN PO’ DI SOLUZIONI...See it: live!

Page 22: m-v-vm @ dotNetMarche

DOMANDISSIME...?Metto le cuffie :-)