SlideShare una empresa de Scribd logo
1 de 28
MODEL VIEW VIEWMODEL
Silverlight Version

Mauro Servienti
Senior Software Architect @ Gaia S.r.l.
Microsoft MVP – Visual C# / MCTS

mauro.servienti@gaia.is.it
http://milestone.topics.it
Agenda
• Part I

  • Waiting for Model View ViewModel;


  • Required & Missing Concepts;


  • Model View ViewModel Deep Dive;



• Part II

  • Facciamolo!
WAITING...
Model View ViewModel Primer
Mumble...mumble... (upfront)
• È difficile?  parecchio... :-)
  • Siamo troppo abituati al «coupling» tra componenti visuali e logica


• Quindi...il gioco vale la candela?
  • Tutta la vita, in particolare al crescere dall’applicazione:
     • Sia verticalmente: complessità;
     • Sia orizzontalmente: versioning nel tempo;



• C’è rischio di addiction? «Purtroppo» si :-)
  • Una volta che ci avete preso la mano scrivereste anche il notepad
    con M-V-VM;
Why?... pecccchè?
• Perchè adottare un pattern per la presentazione dei dati?


• SoC e SPoR sono sicuramente due buonissimi motivi:
  • Diamo un boost alla manutenibilità liberandoci dello spaghetti code;


• Cerchiamo di separare nettamente le figure coinvolte:
  • Il designer non è il developer e il devloper non è il designer;
  • Non necessariamente sono figure fisicamente diverse, ma
    sicuramente sono momenti diversi;


• Introduciamo la possibilità di testare il comportamento
 della logica che gestisce la UI;
Talebani o Libertini?
• Dogma: Un pattern è un pattern quindi va sempre
 adattato al contesto in cui viene calato;

• Model View ViewModel però...:
  • Nella sua implementazione con Wpf/Sl è giovane;
  • Molte cose sono decisamente borderline;
  • Il contesto d’uso classico, un rich client, lo rende complesso da
    applicare perchè le celte da fare sono moltissime:
     • MVC con Asp.net ha decisamente poca libertà di manovra per come è
       fatto http;
     • MVP con WinForms è molto limitato dalle limitazioni di WinForms;


• All’inizio essere un po’ talebani aiuta a pensare;
REQUIREMENTS
Silverlight/Wpf required concepts
DATABINDING
Overview
    DependencyObject                         POCO Instance
    Tipicamente la UI                        I nostri dati

       Dependency                                  CLR
                        Binding Expression
        Property                                 Property




• La BindingSource può essere una qualsiasi
  istanza, senza nessun requisito;
• Il BindingTarget deve essere una Dependency
  Property, e quindi un l'istanza di un Dependency
  Object;
DataFlow Direction
     DependencyObject                                   POCO Instance
          Dependency                                   CLR
                                     - OneWay
           Property                                  Property
                                     - TwoWay
                                     - OneWayToSource

• OneWay: il binding è monodirezionale:
  • da Source verso Target;
  • è il default per controlli i read-only (eg. TextBlock);
• TwoWay: il binding è bidirezionale:
   • I dati viaggiano da Source verso Target e viceversa;
   • È il default per tutti controlli r/w (eg. TextBox)
• OneTime: il binding viene valuato una sola valta:
  • da Source verso Target;
Data «Triggers»
• Cosa causa il pull/push dei dati?
  • Source (data)  Target (UI):
    • OneWay e TwoWay: la source deve implementare un motore di notifica
      come ad esempio INotifyPropertyChanged;
    • Nel caso di collection la collection deve supportare la notifica delle
      variazioni interne... More to come;
  • Target (UI)  Source (data):
    • TwoWay e OneWayToSource:
       • «Default»: predefinito, la source viene aggiornata nel momento in cui il
         controllo corrente perde il focus;
       • «PropertyChanged»: la Source è aggiornata ad ogni variazione della
         proprietà del target;
       • «Explicit»: la source viene aggiornata solo su richiesta esplicita:
         BindingExpression.UpdateSource();
Xaml everywhere
<StackPanel>
 <StackPanel.Resources>
     <SomeResourceHere x:Key="myRes"/>
 </StackPanel.Resources>
<StackPanel.DataContext>
 <Binding Source="{StaticResource myRes}"/>
</StackPanel.DataContext>
 <TextBlock
   Text="{Binding Path=PropName}" />
</StackPanel>
Da WinForms a *.DataContext
• In Windows Forms era responsabilità di ogni singolo
 controllo esporre un sistema per il data binding:
  • .DataSource;
  • .SetDataBinding(...);
  • TextBox.????;
• FrameworkElement espone DataContext:
  • Razionalizza e uniforma l'approccio;
  • È una Dependency Property:
    • beneficia del concetto di ereditarietà del valore;
    • Supporta a sua volta data binding;
Binding Pipeline
TextBlock                                      MyObject
                         Source  Target
       Text                                       DateTime
     Property           Target  Source           Property


       • Per impostazione predefinita il motore di binding per
        la conversione chiama ToString()
            • NB: In assenza di un template;
       • Possiamo intervenire nel processo di conversione
        scrivendo un ValueConverter
Binding Pipeline: IValueConverter
 • IValueConverter definisce solo 2 metodi:
    • Convert( ... ): viene invocato dal processo di binding nel momento
      in cui il dato si muove dalla Source verso il Target;
    • ConvertBack( ... ): viene invocato durante il passaggio
      opposto, mentre il dato viaggia dal Target verso la Source;




<TextBlock Text="{Binding
            Path=PropName,
            Converter={StaticResource myConverter}}" />
COMMANDING
Separation of Concern
• Il concetto di command in Silverlight/Wpf è basato sul
 command pattern:
  • La logica di esecuzione è independente dalla UI;
  • Incapsulare la logica di esecuzione permette di avere più entry-
   point verso quel comando


• Chi si ricorda le Action di delphi...?
L'interfaccia ICommand
• CanExecute( Object ):
  • L'invoker può sapere se il comando può essere eseguito in un
    determinato contesto;
• Execute( Object ):
  • L'invoker può invocare il comando;
• CanExecuteChanged event:
  • Il comando può notificare l'invoker di eventuali variazioni del suo
    stato;
LET’S GO
Adesso che abbiamo messo le fondamenta...
Please welcome M-V-VM




                                            presentation
                    View

                       DataBinding

                       Command




                                            engine
Il centro del     ViewModel          D.I.

   mondo!

                   Repository<T>

                    Model




                                            data
                        Adapter



                Somewhere in
                   time...
ACTORS
Actors: Model
• È uno ed uno solo:
  • Rappresenta i dati, che in quanti tali, vanno sempre protetti;



• Può essere un Object Model o un Domain Model:
  • È molto più facile che sia un «Object Model» condito da servizi;



• È responsabile della validazione statica:
  • Le regole di validazione non pertinenti al caso d’uso;



• È totalmente ignaro del mondo in cui è inserito:
  • Non implementa INotifyPropertyChanged;
Actors: ViewModel
• Rappresenta un caso d’uso del Modello:
  • È un aggregatore di logica e dati;



• È responsabile della validazione contestuale:
  • Casi d’uso diversi con regole di validazione diverse per dati uguali;



• È conscio di essere in un mondo basato su DataBinding:
  • Implementa INotifyPropertyChanged, ma non deriva da Dep.Obj;



• E’ responsabile del «flattening» del grafo:
  • Ricuce l’uso dei comodi ma scomodi converter;
Actors: View
• È «stupidamente» legata al ViewModel:
  • Non prende la benchè minima decisione;



• Deve essere a prova di designer:
  • Quindi non deve aver nessun rapporto con il codice;



• Deve poter essere disegnata:
  • Focus on the «Blendability»;
Who comes first?
• Abbiamo un duopolio...
  • ma...chi comanda?



• ViewModel first?


• View first?


• Io sono per il ViewModel first perchè vedo la View come
 una passive-view;
SEE IT LIVE!
Hands on Model View ViewModel
Recap
• Abbiamo definito il modello: Person/Address;
  • OT: Abbiamo introdotto il concetto di DataContext;


• Abbiamo costruito dei casi d’uso sul modello: ViewModel
  • Visualizzare un elenco di persone;
  • Visualizzare il dettaglio della persona selezionata;


• Abbiamo «visualizzato» i casi d’uso: View;


• Potevamo scrivere dei test prima di arrivare alla View?
• Servono ancora gli «U.A.T.»?
Q&A
do not shoot the pianist

Más contenido relacionado

Destacado

Writing apps for android with .net
Writing apps for android with .net Writing apps for android with .net
Writing apps for android with .net Leonardo Alario
 
UI Composition - Prism
UI Composition - PrismUI Composition - Prism
UI Composition - PrismDotNetMarche
 
Iter documentale per gli iscritti alla sezione E del RUI (collaborazione con ...
Iter documentale per gli iscritti alla sezione E del RUI (collaborazione con ...Iter documentale per gli iscritti alla sezione E del RUI (collaborazione con ...
Iter documentale per gli iscritti alla sezione E del RUI (collaborazione con ...Fabrizio Callarà
 
Model-View-ViewModel
Model-View-ViewModelModel-View-ViewModel
Model-View-ViewModelDotNetMarche
 

Destacado (9)

WPF 4 fun
WPF 4 funWPF 4 fun
WPF 4 fun
 
Writing apps for android with .net
Writing apps for android with .net Writing apps for android with .net
Writing apps for android with .net
 
WPF MVVM Toolkit
WPF MVVM ToolkitWPF MVVM Toolkit
WPF MVVM Toolkit
 
UI Composition - Prism
UI Composition - PrismUI Composition - Prism
UI Composition - Prism
 
m-v-vm @ dotNetMarche
m-v-vm @ dotNetMarchem-v-vm @ dotNetMarche
m-v-vm @ dotNetMarche
 
Iter documentale per gli iscritti alla sezione E del RUI (collaborazione con ...
Iter documentale per gli iscritti alla sezione E del RUI (collaborazione con ...Iter documentale per gli iscritti alla sezione E del RUI (collaborazione con ...
Iter documentale per gli iscritti alla sezione E del RUI (collaborazione con ...
 
Model-View-ViewModel
Model-View-ViewModelModel-View-ViewModel
Model-View-ViewModel
 
Introduzione WPF
Introduzione WPFIntroduzione WPF
Introduzione WPF
 
WPF MVVM Toolkit
WPF MVVM ToolkitWPF MVVM Toolkit
WPF MVVM Toolkit
 

Similar a Silverlight m v-vm @ DotNetteria

Brokering over WCF @ dotNetMarche
Brokering over WCF @ dotNetMarcheBrokering over WCF @ dotNetMarche
Brokering over WCF @ dotNetMarcheMauro Servienti
 
Dal requisito all'implementazione @ CD2010
Dal requisito all'implementazione @ CD2010Dal requisito all'implementazione @ CD2010
Dal requisito all'implementazione @ CD2010Mauro Servienti
 
ASP.NET MVC: Andare oltre il 100% (Web@work)
ASP.NET MVC: Andare oltre il 100% (Web@work)ASP.NET MVC: Andare oltre il 100% (Web@work)
ASP.NET MVC: Andare oltre il 100% (Web@work)Giorgio Di Nardo
 
Fe04 angular js-101
Fe04   angular js-101Fe04   angular js-101
Fe04 angular js-101DotNetCampus
 
Il pattern mvvm come strutturare al meglio il vostro progetto
Il pattern mvvm come strutturare al meglio il vostro progettoIl pattern mvvm come strutturare al meglio il vostro progetto
Il pattern mvvm come strutturare al meglio il vostro progettoMicrosoft Mobile Developer
 
Esempi di AOP (Gian Maria Ricci)
 Esempi di AOP (Gian Maria Ricci) Esempi di AOP (Gian Maria Ricci)
Esempi di AOP (Gian Maria Ricci)DotNetMarche
 
Slide typescript - xe dotnet - Codemotion Rome 2015
Slide typescript - xe dotnet - Codemotion Rome 2015Slide typescript - xe dotnet - Codemotion Rome 2015
Slide typescript - xe dotnet - Codemotion Rome 2015Codemotion
 
Azure dayroma java, il lato oscuro del cloud
Azure dayroma   java, il lato oscuro del cloudAzure dayroma   java, il lato oscuro del cloud
Azure dayroma java, il lato oscuro del cloudRiccardo Zamana
 
TYPESCRIPT, ANGULAR E BOOTSTRAP ASSIEME PER APPLICAZIONI REAL WORLD
TYPESCRIPT, ANGULAR E BOOTSTRAP ASSIEME PER APPLICAZIONI REAL WORLDTYPESCRIPT, ANGULAR E BOOTSTRAP ASSIEME PER APPLICAZIONI REAL WORLD
TYPESCRIPT, ANGULAR E BOOTSTRAP ASSIEME PER APPLICAZIONI REAL WORLDDotNetCampus
 
Slide typescript - net campus
Slide typescript - net campusSlide typescript - net campus
Slide typescript - net campusDotNetCampus
 
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-service
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-servicePower BI: Introduzione ai dataflow e alla preparazione dei dati self-service
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-serviceMarco Pozzan
 
Inversion of Control @ CD2008
Inversion of Control @ CD2008Inversion of Control @ CD2008
Inversion of Control @ CD2008Mauro Servienti
 
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBPolyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBSteve Maraspin
 
Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)Fabio Armani
 
Microsoft Azure per l'IT Pro
Microsoft Azure per l'IT ProMicrosoft Azure per l'IT Pro
Microsoft Azure per l'IT ProMarco Parenzan
 
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente Andrea Dottor
 

Similar a Silverlight m v-vm @ DotNetteria (20)

Brokering over WCF @ dotNetMarche
Brokering over WCF @ dotNetMarcheBrokering over WCF @ dotNetMarche
Brokering over WCF @ dotNetMarche
 
Dal requisito all'implementazione @ CD2010
Dal requisito all'implementazione @ CD2010Dal requisito all'implementazione @ CD2010
Dal requisito all'implementazione @ CD2010
 
ASP.NET MVC: Andare oltre il 100% (Web@work)
ASP.NET MVC: Andare oltre il 100% (Web@work)ASP.NET MVC: Andare oltre il 100% (Web@work)
ASP.NET MVC: Andare oltre il 100% (Web@work)
 
Fe04 angular js-101
Fe04   angular js-101Fe04   angular js-101
Fe04 angular js-101
 
Il pattern mvvm come strutturare al meglio il vostro progetto
Il pattern mvvm come strutturare al meglio il vostro progettoIl pattern mvvm come strutturare al meglio il vostro progetto
Il pattern mvvm come strutturare al meglio il vostro progetto
 
Esempi di AOP (Gian Maria Ricci)
 Esempi di AOP (Gian Maria Ricci) Esempi di AOP (Gian Maria Ricci)
Esempi di AOP (Gian Maria Ricci)
 
Slide typescript - xe dotnet - Codemotion Rome 2015
Slide typescript - xe dotnet - Codemotion Rome 2015Slide typescript - xe dotnet - Codemotion Rome 2015
Slide typescript - xe dotnet - Codemotion Rome 2015
 
Azure dayroma java, il lato oscuro del cloud
Azure dayroma   java, il lato oscuro del cloudAzure dayroma   java, il lato oscuro del cloud
Azure dayroma java, il lato oscuro del cloud
 
TYPESCRIPT, ANGULAR E BOOTSTRAP ASSIEME PER APPLICAZIONI REAL WORLD
TYPESCRIPT, ANGULAR E BOOTSTRAP ASSIEME PER APPLICAZIONI REAL WORLDTYPESCRIPT, ANGULAR E BOOTSTRAP ASSIEME PER APPLICAZIONI REAL WORLD
TYPESCRIPT, ANGULAR E BOOTSTRAP ASSIEME PER APPLICAZIONI REAL WORLD
 
Slide typescript - net campus
Slide typescript - net campusSlide typescript - net campus
Slide typescript - net campus
 
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-service
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-servicePower BI: Introduzione ai dataflow e alla preparazione dei dati self-service
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-service
 
Inversion of Control @ CD2008
Inversion of Control @ CD2008Inversion of Control @ CD2008
Inversion of Control @ CD2008
 
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBPolyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
 
UI Composition
UI CompositionUI Composition
UI Composition
 
Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)
 
Web frameworks
Web frameworksWeb frameworks
Web frameworks
 
Microsoft Azure per l'IT Pro
Microsoft Azure per l'IT ProMicrosoft Azure per l'IT Pro
Microsoft Azure per l'IT Pro
 
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
 
iOS_Course_8
iOS_Course_8iOS_Course_8
iOS_Course_8
 
Presentazione Unibo
Presentazione UniboPresentazione Unibo
Presentazione Unibo
 

Más de Mauro Servienti

Welcome to the (state) machine @ ExploreDDD 2019
Welcome to the (state) machine @ ExploreDDD 2019Welcome to the (state) machine @ ExploreDDD 2019
Welcome to the (state) machine @ ExploreDDD 2019Mauro Servienti
 
Designing a ui for microservices @ .NET Day Switzerland 2019
Designing a ui for microservices @ .NET Day Switzerland 2019Designing a ui for microservices @ .NET Day Switzerland 2019
Designing a ui for microservices @ .NET Day Switzerland 2019Mauro Servienti
 
Welcome to the (state) machine @ Xe One Day Enterprise Applications
Welcome to the (state) machine @ Xe One Day Enterprise ApplicationsWelcome to the (state) machine @ Xe One Day Enterprise Applications
Welcome to the (state) machine @ Xe One Day Enterprise ApplicationsMauro Servienti
 
All our aggregates are wrong @ NDC Copenhagen 2019
All our aggregates are wrong @ NDC Copenhagen 2019All our aggregates are wrong @ NDC Copenhagen 2019
All our aggregates are wrong @ NDC Copenhagen 2019Mauro Servienti
 
Be like water, my friend @ Agile for Innovation 2019
Be like water, my friend @ Agile for Innovation 2019Be like water, my friend @ Agile for Innovation 2019
Be like water, my friend @ Agile for Innovation 2019Mauro Servienti
 
Microservices architecture is it the right choice to design long-living syste...
Microservices architecture is it the right choice to design long-living syste...Microservices architecture is it the right choice to design long-living syste...
Microservices architecture is it the right choice to design long-living syste...Mauro Servienti
 
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019Mauro Servienti
 
Living organizations, particular software @ do IT Better Parma
Living organizations, particular software @ do IT Better ParmaLiving organizations, particular software @ do IT Better Parma
Living organizations, particular software @ do IT Better ParmaMauro Servienti
 
Welcome to the (state) machine @ Crafted Software
Welcome to the (state) machine @ Crafted SoftwareWelcome to the (state) machine @ Crafted Software
Welcome to the (state) machine @ Crafted SoftwareMauro Servienti
 
PO is dead, long live the PO - Italian Agile Day 2018
PO is dead, long live the PO - Italian Agile Day 2018PO is dead, long live the PO - Italian Agile Day 2018
PO is dead, long live the PO - Italian Agile Day 2018Mauro Servienti
 
Design a UI for your Microservices @ Do IT Better
Design a UI for your Microservices @ Do IT BetterDesign a UI for your Microservices @ Do IT Better
Design a UI for your Microservices @ Do IT BetterMauro Servienti
 
Microservices and pineapple on pizza what do they have in common - dos and ...
Microservices and pineapple on pizza   what do they have in common - dos and ...Microservices and pineapple on pizza   what do they have in common - dos and ...
Microservices and pineapple on pizza what do they have in common - dos and ...Mauro Servienti
 
All our aggregates are wrong (ExploreDDD 2018)
All our aggregates are wrong (ExploreDDD 2018)All our aggregates are wrong (ExploreDDD 2018)
All our aggregates are wrong (ExploreDDD 2018)Mauro Servienti
 
Designing a ui for microservices
Designing a ui for microservicesDesigning a ui for microservices
Designing a ui for microservicesMauro Servienti
 
Po is dead, long live the po
Po is dead, long live the poPo is dead, long live the po
Po is dead, long live the poMauro Servienti
 
Shipping code is not the problem, deciding what to ship it is!
Shipping code is not the problem, deciding what to ship it is!Shipping code is not the problem, deciding what to ship it is!
Shipping code is not the problem, deciding what to ship it is!Mauro Servienti
 
GraphQL - Where are you from? Where are you going?
GraphQL - Where are you from? Where are you going?GraphQL - Where are you from? Where are you going?
GraphQL - Where are you from? Where are you going?Mauro Servienti
 
Dall'idea al deploy un lungo viaggio che passa per git flow e semver
Dall'idea al deploy   un lungo viaggio che passa per git flow e semverDall'idea al deploy   un lungo viaggio che passa per git flow e semver
Dall'idea al deploy un lungo viaggio che passa per git flow e semverMauro Servienti
 
Progettare una UI per i Microservices
Progettare una UI per i MicroservicesProgettare una UI per i Microservices
Progettare una UI per i MicroservicesMauro Servienti
 
The road to a Service Oriented Architecture is paved with messages
The road to a Service Oriented Architecture is paved with messagesThe road to a Service Oriented Architecture is paved with messages
The road to a Service Oriented Architecture is paved with messagesMauro Servienti
 

Más de Mauro Servienti (20)

Welcome to the (state) machine @ ExploreDDD 2019
Welcome to the (state) machine @ ExploreDDD 2019Welcome to the (state) machine @ ExploreDDD 2019
Welcome to the (state) machine @ ExploreDDD 2019
 
Designing a ui for microservices @ .NET Day Switzerland 2019
Designing a ui for microservices @ .NET Day Switzerland 2019Designing a ui for microservices @ .NET Day Switzerland 2019
Designing a ui for microservices @ .NET Day Switzerland 2019
 
Welcome to the (state) machine @ Xe One Day Enterprise Applications
Welcome to the (state) machine @ Xe One Day Enterprise ApplicationsWelcome to the (state) machine @ Xe One Day Enterprise Applications
Welcome to the (state) machine @ Xe One Day Enterprise Applications
 
All our aggregates are wrong @ NDC Copenhagen 2019
All our aggregates are wrong @ NDC Copenhagen 2019All our aggregates are wrong @ NDC Copenhagen 2019
All our aggregates are wrong @ NDC Copenhagen 2019
 
Be like water, my friend @ Agile for Innovation 2019
Be like water, my friend @ Agile for Innovation 2019Be like water, my friend @ Agile for Innovation 2019
Be like water, my friend @ Agile for Innovation 2019
 
Microservices architecture is it the right choice to design long-living syste...
Microservices architecture is it the right choice to design long-living syste...Microservices architecture is it the right choice to design long-living syste...
Microservices architecture is it the right choice to design long-living syste...
 
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
 
Living organizations, particular software @ do IT Better Parma
Living organizations, particular software @ do IT Better ParmaLiving organizations, particular software @ do IT Better Parma
Living organizations, particular software @ do IT Better Parma
 
Welcome to the (state) machine @ Crafted Software
Welcome to the (state) machine @ Crafted SoftwareWelcome to the (state) machine @ Crafted Software
Welcome to the (state) machine @ Crafted Software
 
PO is dead, long live the PO - Italian Agile Day 2018
PO is dead, long live the PO - Italian Agile Day 2018PO is dead, long live the PO - Italian Agile Day 2018
PO is dead, long live the PO - Italian Agile Day 2018
 
Design a UI for your Microservices @ Do IT Better
Design a UI for your Microservices @ Do IT BetterDesign a UI for your Microservices @ Do IT Better
Design a UI for your Microservices @ Do IT Better
 
Microservices and pineapple on pizza what do they have in common - dos and ...
Microservices and pineapple on pizza   what do they have in common - dos and ...Microservices and pineapple on pizza   what do they have in common - dos and ...
Microservices and pineapple on pizza what do they have in common - dos and ...
 
All our aggregates are wrong (ExploreDDD 2018)
All our aggregates are wrong (ExploreDDD 2018)All our aggregates are wrong (ExploreDDD 2018)
All our aggregates are wrong (ExploreDDD 2018)
 
Designing a ui for microservices
Designing a ui for microservicesDesigning a ui for microservices
Designing a ui for microservices
 
Po is dead, long live the po
Po is dead, long live the poPo is dead, long live the po
Po is dead, long live the po
 
Shipping code is not the problem, deciding what to ship it is!
Shipping code is not the problem, deciding what to ship it is!Shipping code is not the problem, deciding what to ship it is!
Shipping code is not the problem, deciding what to ship it is!
 
GraphQL - Where are you from? Where are you going?
GraphQL - Where are you from? Where are you going?GraphQL - Where are you from? Where are you going?
GraphQL - Where are you from? Where are you going?
 
Dall'idea al deploy un lungo viaggio che passa per git flow e semver
Dall'idea al deploy   un lungo viaggio che passa per git flow e semverDall'idea al deploy   un lungo viaggio che passa per git flow e semver
Dall'idea al deploy un lungo viaggio che passa per git flow e semver
 
Progettare una UI per i Microservices
Progettare una UI per i MicroservicesProgettare una UI per i Microservices
Progettare una UI per i Microservices
 
The road to a Service Oriented Architecture is paved with messages
The road to a Service Oriented Architecture is paved with messagesThe road to a Service Oriented Architecture is paved with messages
The road to a Service Oriented Architecture is paved with messages
 

Silverlight m v-vm @ DotNetteria

  • 1. MODEL VIEW VIEWMODEL Silverlight Version Mauro Servienti Senior Software Architect @ Gaia S.r.l. Microsoft MVP – Visual C# / MCTS mauro.servienti@gaia.is.it http://milestone.topics.it
  • 2. Agenda • Part I • Waiting for Model View ViewModel; • Required & Missing Concepts; • Model View ViewModel Deep Dive; • Part II • Facciamolo!
  • 4. Mumble...mumble... (upfront) • È difficile?  parecchio... :-) • Siamo troppo abituati al «coupling» tra componenti visuali e logica • Quindi...il gioco vale la candela? • Tutta la vita, in particolare al crescere dall’applicazione: • Sia verticalmente: complessità; • Sia orizzontalmente: versioning nel tempo; • C’è rischio di addiction? «Purtroppo» si :-) • Una volta che ci avete preso la mano scrivereste anche il notepad con M-V-VM;
  • 5. Why?... pecccchè? • Perchè adottare un pattern per la presentazione dei dati? • SoC e SPoR sono sicuramente due buonissimi motivi: • Diamo un boost alla manutenibilità liberandoci dello spaghetti code; • Cerchiamo di separare nettamente le figure coinvolte: • Il designer non è il developer e il devloper non è il designer; • Non necessariamente sono figure fisicamente diverse, ma sicuramente sono momenti diversi; • Introduciamo la possibilità di testare il comportamento della logica che gestisce la UI;
  • 6. Talebani o Libertini? • Dogma: Un pattern è un pattern quindi va sempre adattato al contesto in cui viene calato; • Model View ViewModel però...: • Nella sua implementazione con Wpf/Sl è giovane; • Molte cose sono decisamente borderline; • Il contesto d’uso classico, un rich client, lo rende complesso da applicare perchè le celte da fare sono moltissime: • MVC con Asp.net ha decisamente poca libertà di manovra per come è fatto http; • MVP con WinForms è molto limitato dalle limitazioni di WinForms; • All’inizio essere un po’ talebani aiuta a pensare;
  • 9. Overview DependencyObject POCO Instance Tipicamente la UI I nostri dati Dependency CLR Binding Expression Property Property • La BindingSource può essere una qualsiasi istanza, senza nessun requisito; • Il BindingTarget deve essere una Dependency Property, e quindi un l'istanza di un Dependency Object;
  • 10. DataFlow Direction DependencyObject POCO Instance Dependency CLR - OneWay Property Property - TwoWay - OneWayToSource • OneWay: il binding è monodirezionale: • da Source verso Target; • è il default per controlli i read-only (eg. TextBlock); • TwoWay: il binding è bidirezionale: • I dati viaggiano da Source verso Target e viceversa; • È il default per tutti controlli r/w (eg. TextBox) • OneTime: il binding viene valuato una sola valta: • da Source verso Target;
  • 11. Data «Triggers» • Cosa causa il pull/push dei dati? • Source (data)  Target (UI): • OneWay e TwoWay: la source deve implementare un motore di notifica come ad esempio INotifyPropertyChanged; • Nel caso di collection la collection deve supportare la notifica delle variazioni interne... More to come; • Target (UI)  Source (data): • TwoWay e OneWayToSource: • «Default»: predefinito, la source viene aggiornata nel momento in cui il controllo corrente perde il focus; • «PropertyChanged»: la Source è aggiornata ad ogni variazione della proprietà del target; • «Explicit»: la source viene aggiornata solo su richiesta esplicita: BindingExpression.UpdateSource();
  • 12. Xaml everywhere <StackPanel> <StackPanel.Resources> <SomeResourceHere x:Key="myRes"/> </StackPanel.Resources> <StackPanel.DataContext> <Binding Source="{StaticResource myRes}"/> </StackPanel.DataContext> <TextBlock Text="{Binding Path=PropName}" /> </StackPanel>
  • 13. Da WinForms a *.DataContext • In Windows Forms era responsabilità di ogni singolo controllo esporre un sistema per il data binding: • .DataSource; • .SetDataBinding(...); • TextBox.????; • FrameworkElement espone DataContext: • Razionalizza e uniforma l'approccio; • È una Dependency Property: • beneficia del concetto di ereditarietà del valore; • Supporta a sua volta data binding;
  • 14. Binding Pipeline TextBlock MyObject Source  Target Text DateTime Property Target  Source Property • Per impostazione predefinita il motore di binding per la conversione chiama ToString() • NB: In assenza di un template; • Possiamo intervenire nel processo di conversione scrivendo un ValueConverter
  • 15. Binding Pipeline: IValueConverter • IValueConverter definisce solo 2 metodi: • Convert( ... ): viene invocato dal processo di binding nel momento in cui il dato si muove dalla Source verso il Target; • ConvertBack( ... ): viene invocato durante il passaggio opposto, mentre il dato viaggia dal Target verso la Source; <TextBlock Text="{Binding Path=PropName, Converter={StaticResource myConverter}}" />
  • 17. Separation of Concern • Il concetto di command in Silverlight/Wpf è basato sul command pattern: • La logica di esecuzione è independente dalla UI; • Incapsulare la logica di esecuzione permette di avere più entry- point verso quel comando • Chi si ricorda le Action di delphi...?
  • 18. L'interfaccia ICommand • CanExecute( Object ): • L'invoker può sapere se il comando può essere eseguito in un determinato contesto; • Execute( Object ): • L'invoker può invocare il comando; • CanExecuteChanged event: • Il comando può notificare l'invoker di eventuali variazioni del suo stato;
  • 19. LET’S GO Adesso che abbiamo messo le fondamenta...
  • 20. Please welcome M-V-VM presentation View DataBinding Command engine Il centro del ViewModel D.I. mondo! Repository<T> Model data Adapter Somewhere in time...
  • 22. Actors: Model • È uno ed uno solo: • Rappresenta i dati, che in quanti tali, vanno sempre protetti; • Può essere un Object Model o un Domain Model: • È molto più facile che sia un «Object Model» condito da servizi; • È responsabile della validazione statica: • Le regole di validazione non pertinenti al caso d’uso; • È totalmente ignaro del mondo in cui è inserito: • Non implementa INotifyPropertyChanged;
  • 23. Actors: ViewModel • Rappresenta un caso d’uso del Modello: • È un aggregatore di logica e dati; • È responsabile della validazione contestuale: • Casi d’uso diversi con regole di validazione diverse per dati uguali; • È conscio di essere in un mondo basato su DataBinding: • Implementa INotifyPropertyChanged, ma non deriva da Dep.Obj; • E’ responsabile del «flattening» del grafo: • Ricuce l’uso dei comodi ma scomodi converter;
  • 24. Actors: View • È «stupidamente» legata al ViewModel: • Non prende la benchè minima decisione; • Deve essere a prova di designer: • Quindi non deve aver nessun rapporto con il codice; • Deve poter essere disegnata: • Focus on the «Blendability»;
  • 25. Who comes first? • Abbiamo un duopolio... • ma...chi comanda? • ViewModel first? • View first? • Io sono per il ViewModel first perchè vedo la View come una passive-view;
  • 26. SEE IT LIVE! Hands on Model View ViewModel
  • 27. Recap • Abbiamo definito il modello: Person/Address; • OT: Abbiamo introdotto il concetto di DataContext; • Abbiamo costruito dei casi d’uso sul modello: ViewModel • Visualizzare un elenco di persone; • Visualizzare il dettaglio della persona selezionata; • Abbiamo «visualizzato» i casi d’uso: View; • Potevamo scrivere dei test prima di arrivare alla View? • Servono ancora gli «U.A.T.»?
  • 28. Q&A do not shoot the pianist