The Dark Side of .NET Programming

Il blog di Michele Aponte
posts - 212, comments - 145, trackbacks - 16

DotNetMarche: M-V-VM con Mauro Servienti

Mauro ci parla di Model View ViewModel. Durante lo sviluppo  di un’applciazione complessa ci devono spaventare:

  • static: come lo testiamo? E se mantiene uno stato? Se vogliamo cambiare il comportamento?
  • new: come lo testiamo? Se vogliamo cambiare il comportamento?
  • Serviceprovider.GetService<T>()

Esternalizzando le dipendenze, dependency injection, possiamo di risolvere questi problemi, possiamo testare e mockare come volgiamo e possiamo iniettare tutti i comportamenti che vogliamo. In particolare l’injection possiamo farla via costruttore o via property (optional vs Mandatory). Introduciamo quindi le interfacce e mediante IoC chiediamo a qualcun altro di istanziare la classe concreta per noi. Naturalmente in un’applicazione corposa questo meccanismo potrebbe far esplodere il codice, inoltre per i servizi può essere inutile avere un’istanza nuova per ogni richiesta.

Model View ViewModel fa, con modalità diverse, la stessa cosa di Model View Presenter: separa la presentazione dei dati dal Model. In particolare sfrutta la potentissima infrastruttura di binding e commanding di WPF. I vantaggi sono tanti:

  • mediatore della comunicazione
  • il designer non deve scrivere codice
  • sfrutta il potentissimo motore di binding e commanding di wpf
  • aggiunta di behavior ad un grafo (es. delete command su una row)
  • semplificazione dello xaml perchè può ridurre drasticamente l’uso dei converter

Il ViewModel è una banale classe che implementa INotifyPropertyChanged e basta! Si potrebbe essere tentati di dipendere da DependencyObject ma introduciamo una dipendenza da tutto wpf al solo scopo di avere la notifica simile a INotifyPropertyChanged. Ci basta mettere un’istanza di questa classe nel datacontext della nostra view per accedere al suo contenuto. Su un dominio complesso passiamo la vita a scrivere ViewModel/DTO.

Considerazioni:

  • View first o ViewModel first?
    • La blendability è importante
    • Come comunicano View e ViewModel:
      • uno per tutti: interecettare la chiusura della View
  • In ottica Dependency Injection 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:

  • testabilità della logica della UI
  • sotituibilità della UI (stesso View Engine)
  • elevata manutenibilità

Difetti:

  • Aumento della complessità e mancanza di controllori
  • Il data binding non risolve tutti gli scenari (es. la chiusura della view con messagebox)

Non è tutto oro quello 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 cosa intendiamo per produttivo:
    • pessimo supporto dei designer
    • struttura della solution obbliga alla rebuild
    • possiamo testare tutto, quasi;
    • elevatissima manutenibilità;
  • E’ performante? Si, ma che importa? :-)

E’ un mito quest’uomo!

Print | posted on giovedì 28 gennaio 2010 04:33 |

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET