SlideShare une entreprise Scribd logo
1  sur  29
UI Composition
Problemi e “possibili” Soluzioni



Mauro Servienti
Microsoft MVP - Visual C#
Software Mason @ Managed Designs

http://blogs.ugidotnet.org/topics
mauro.servienti@gmail.com
Agenda
• Indagine di mercato;
• M-V-VM:
  – Overview;
  – Il dottore ha detto...
• UI Composition
  – Ma pecccchè?
  – I problemi;
  – Le possibili soluzioni;
• Parliamone insieme.
Italiani! :-P

INDAGINE DI MERCATO
Per alzata di mano...
Abbiamo 29 slide...dobbiamo capire come
usarle.. Agili, agili ;-)

• Quanti hanno familiarità con IoC e DI?

• Quanti conoscono e usano M-V-VM?
Tutti ne parlano... Ma che cosa è?

M-V-VM: OVERVIEW
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...
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... 
Il libro che ho letto dice che devo fare così, ma tu invece hai fatto cosà...!

M-V-VM: IL DOTTORE HA DETTO...
Il centro del mondo
• Il designer non deve scrivere codice;
  – > Il ViewModel deve diventare il vostro unico
    punto di riferimento;
• Ma non tutto si può “bindare” purtroppo:
  – Come gestiamo il processo di chiusura della View?
  – E quello di attivazione?
  – Come interagiamo con l’utente?
     • Dialog (dialog owner), MessageBoxes, etc...
Iniettiamo anche la ‘I’View...
• Se facciamo uso di IoC, ci siamo già in parte
  tagliati le gambe:
    class MyViewModel
    {
      public MyViewModel( IRepository<Customer> repo ){ ... }
    }


• Tanto vale farlo fino in fondo:
    class MyViewModel
    {
      public MyViewModel( IView view, IRepository<Customer> repo ){ ... }
    }
...e ‘I’View diventa

        interface IView
        {
          Object DataContext{ get; set; }
        }
                        interface ICloseableView : IView
                        {
                          event CancelEventHandler Closing;
                          event EventHandler Closed;
                        }



Alla fine il nostro compito è consegnare valore non
                     filosofeggiare ;-)
È un investimento decisamente onoreso, ne vale la pena?

UI COMPOSITION: PERCHÈ?
Bella domanda...
• Cliente: necessità di modularizzare:
  – Acquistare in configurazioni diverse;
  – Installare in configurazioni diverse;
• Team: necessità di gestire e lavorare:
  – Team grande o distribuito;
  – Soluzione/i di dimensioni ingestibili in VS;
  – Tempi di sviluppo diversi dei “moduli” che non
    devono condizionarsi/bloccarsi a vicenda;
Ok, chiaro... Ma a che costo?

UI COMPOSITION: I PROBLEMI
Requisiti: un esempio
• Semplice applicazione “gestionale”:
  – Anagrafiche;
  – Contabilità;
• Il cliente deve poter installare il “modulo”
  anagrafiche senza la contabilità;
• Il team deve poter sviluppare i 2 moduli
  indipendentemente;
Domain Model
• Contabilità “dipende” da Anagrafiche?




• Dipende... ;-) da che cosa?
   – Se modularizzo per necessità di sviluppo;
   – Se modularizzo per necessità di deploy;
Semplicità, adesso è tutto così facile...
            “Region... perchè sei tu region”



                                         Toolbars e Documents sono
                                         Region in cui poter iniettare
                                         contenuti a runtime




                                    xxxDetails è una Region in cui
                                    poter iniettare contenuti
                                    contestuali a runtime
Semplicità...adesso un po’ meno...




Ecco perchè per mettere M-V-VM al centro del
    mondo è necessario sporcarsi le mani
Region: statiche e dinamiche
• Toolbars e Documents sono region “statiche”;
  – Referenziabili per “nome”;
• Ma se avessimo più Window?
    CustomerWindow: Instance 1   CustomerWindow: Instance 2
    “ContentRegion”              “ContentRegion”




• IRegionManager.GetRegion( name ) ?
• svc.RegisterRegion( name, view );
• svc.GetManager( view ).GetRegion( name );
Come comunicano?


                                                Una toolbar contestuale
l’elemento selezionato deve
                                                compare quando visualizziamo
“attivare” un Command nella
                                                contenuti contestuali
toolbar




                              La variazione di selezione deve
                              essere intercettata per iniettare
                              i contenuti contestuali
L’ecosistema: è un mondo difficile
• L’ecosistema: lunga vita a Visual Studio
  – la shell;
  – i moduli;
  – il processo di bootstrap;
• Diligenza assoluta, farsi prendere la mano, e
  sporcarla, è molto facile ma il rischio è di
  pagarla cara dopo;
• La navigazione e il ciclo di vita dei
  “documenti”: RunningDocumentsService;
Comporre, scomporre e ricomporre questo è il segreto...

UI COMPOSITION: LE POSSIBILI
SOLUZIONI
Il mio Domain Model
• Il pericolo è il mio mestiere:




• Potreste avere un Repository<T> basato su servizi
  WCF;
• Naturalmente... non si possono fare le join;
RegionService, RegionManager, Region
• Wpf e Xaml vi danno la massima libertà: lunga
  vita alle Attached Property;
<ContentPresenter
        rg:RegionService.Region="{rg:ContentPresenterRegion 'myRegionName'}"
/>
Il postino suona sempre 2 volte
• I vari attori, aka Module, non si conoscono ma
  hanno la necessità di comunicare tra loro:
  – Dobbiamo definire una lingua nota a tutti;
  – Dobbiamo designare qualcuno come postino;
Italiani...! La shell si avvia!
• Il nostro postino trasporta messaggi:
  ViewModelLoading<IShellViewModel>()
• che contengono informazioni:
 var regionManager = this.regionService.GetRegionManager( this.View );
 var msg = new ViewModelLoading<IShellViewModel>( this, regionManager );
 this.broker.Dispatch( msg );


• che possiamo usare a nostro uso e consumo:
 this.broker.Subscribe<ViewModelLoading<IShellViewModel>>( this, msg =>
 {
       var viewModel = this.provider.GetService( typeof( IMyContentViewModel ) )
       msg.RegionManager[ "myRegionName" ].Add( viewModel.View );
 } );
IMessage lifecycle
            SearchRequestMessage              Broker




                                     MessageHandler



                  Handler
                  -“Risolve” il ViewModel;
                  - passa le informazione sulla ricerca richiesta;
                  - Inietta la View nella Region;
                  ViewModel
                  -Esegue la ricerca;
                  - Visualizza i risultati;
Messaggi o Eventi: l’unione fa la forza
                            • Ingestibili con
                              messaggi:
                               – Attivazione/Disattiva
                                 zione Document;
                               – Cambio di selezione;

• Gli eventi tornano ad essere vincenti:
  – Una Region notifica il cambio di contenuto attivo;
  – Un ViewModel può interagire con il contenuto:
     – IHandlePrintScenario -> PrintScenarioChanged
m-v-vm @ UgiAlt.Net

Contenu connexe

Similaire à m-v-vm @ UgiAlt.Net

Model-View-ViewModel
Model-View-ViewModelModel-View-ViewModel
Model-View-ViewModelDotNetMarche
 
Dal requisito all'implementazione @ CD2010
Dal requisito all'implementazione @ CD2010Dal requisito all'implementazione @ CD2010
Dal requisito all'implementazione @ CD2010Mauro Servienti
 
Aruba Cloud: 5 minuti sul VisualCloud #Arubait5
Aruba Cloud: 5 minuti sul VisualCloud #Arubait5Aruba Cloud: 5 minuti sul VisualCloud #Arubait5
Aruba Cloud: 5 minuti sul VisualCloud #Arubait5Aruba S.p.A.
 
Come sviluppare applicazioni cross device con HTML
Come sviluppare applicazioni cross device con HTMLCome sviluppare applicazioni cross device con HTML
Come sviluppare applicazioni cross device con HTMLSinergia Totale
 
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
 
Inversion of Control @ CD2008
Inversion of Control @ CD2008Inversion of Control @ CD2008
Inversion of Control @ CD2008Mauro Servienti
 
Integrazione continua con TFS Build
Integrazione continua con TFS BuildIntegrazione continua con TFS Build
Integrazione continua con TFS BuildGian Maria Ricci
 
Layered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSLayered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSAndrea Saltarello
 
Niccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTNiccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTfirenze-gtug
 
Modi innovativi per costruire App
Modi innovativi per costruire AppModi innovativi per costruire App
Modi innovativi per costruire AppCommit University
 
Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)DotNetMarche
 
#LRIS2014 - MessageBus, Cluster communication and Caching on B2B
#LRIS2014 - MessageBus, Cluster communication and Caching on B2B#LRIS2014 - MessageBus, Cluster communication and Caching on B2B
#LRIS2014 - MessageBus, Cluster communication and Caching on B2Bkino2k
 
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
 
Slide Prelaurea. Alessandro Andreosè
Slide Prelaurea. Alessandro AndreosèSlide Prelaurea. Alessandro Andreosè
Slide Prelaurea. Alessandro Andreosèguesta10af3
 
Domain Driven Design e CQRS
Domain Driven Design e CQRSDomain Driven Design e CQRS
Domain Driven Design e CQRSManuel Scapolan
 
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
 

Similaire à m-v-vm @ UgiAlt.Net (20)

UI Composition
UI CompositionUI Composition
UI Composition
 
m-v-vm @ dotNetMarche
m-v-vm @ dotNetMarchem-v-vm @ dotNetMarche
m-v-vm @ dotNetMarche
 
Model-View-ViewModel
Model-View-ViewModelModel-View-ViewModel
Model-View-ViewModel
 
Dal requisito all'implementazione @ CD2010
Dal requisito all'implementazione @ CD2010Dal requisito all'implementazione @ CD2010
Dal requisito all'implementazione @ CD2010
 
Aruba Cloud: 5 minuti sul VisualCloud #Arubait5
Aruba Cloud: 5 minuti sul VisualCloud #Arubait5Aruba Cloud: 5 minuti sul VisualCloud #Arubait5
Aruba Cloud: 5 minuti sul VisualCloud #Arubait5
 
Come sviluppare applicazioni cross device con HTML
Come sviluppare applicazioni cross device con HTMLCome sviluppare applicazioni cross device con HTML
Come sviluppare applicazioni cross device con HTML
 
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
 
Inversion of Control @ CD2008
Inversion of Control @ CD2008Inversion of Control @ CD2008
Inversion of Control @ CD2008
 
Integrazione continua con TFS Build
Integrazione continua con TFS BuildIntegrazione continua con TFS Build
Integrazione continua con TFS Build
 
Layered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSLayered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRS
 
Niccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTNiccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWT
 
Modi innovativi per costruire App
Modi innovativi per costruire AppModi innovativi per costruire App
Modi innovativi per costruire App
 
Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)
 
#LRIS2014 - MessageBus, Cluster communication and Caching on B2B
#LRIS2014 - MessageBus, Cluster communication and Caching on B2B#LRIS2014 - MessageBus, Cluster communication and Caching on B2B
#LRIS2014 - MessageBus, Cluster communication and Caching on B2B
 
HTML5, il lato client della forza...
HTML5, il lato client della forza... HTML5, il lato client della forza...
HTML5, il lato client della forza...
 
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
 
WPF MVVM Toolkit
WPF MVVM ToolkitWPF MVVM Toolkit
WPF MVVM Toolkit
 
Slide Prelaurea. Alessandro Andreosè
Slide Prelaurea. Alessandro AndreosèSlide Prelaurea. Alessandro Andreosè
Slide Prelaurea. Alessandro Andreosè
 
Domain Driven Design e CQRS
Domain Driven Design e CQRSDomain Driven Design e CQRS
Domain Driven Design e CQRS
 
Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)
 

Plus 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
 

Plus 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
 

m-v-vm @ UgiAlt.Net

  • 1. UI Composition Problemi e “possibili” Soluzioni Mauro Servienti Microsoft MVP - Visual C# Software Mason @ Managed Designs http://blogs.ugidotnet.org/topics mauro.servienti@gmail.com
  • 2. Agenda • Indagine di mercato; • M-V-VM: – Overview; – Il dottore ha detto... • UI Composition – Ma pecccchè? – I problemi; – Le possibili soluzioni; • Parliamone insieme.
  • 4. Per alzata di mano... Abbiamo 29 slide...dobbiamo capire come usarle.. Agili, agili ;-) • Quanti hanno familiarità con IoC e DI? • Quanti conoscono e usano M-V-VM?
  • 5. Tutti ne parlano... Ma che cosa è? M-V-VM: OVERVIEW
  • 6. 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...
  • 7. 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... 
  • 8. Il libro che ho letto dice che devo fare così, ma tu invece hai fatto cosà...! M-V-VM: IL DOTTORE HA DETTO...
  • 9. Il centro del mondo • Il designer non deve scrivere codice; – > Il ViewModel deve diventare il vostro unico punto di riferimento; • Ma non tutto si può “bindare” purtroppo: – Come gestiamo il processo di chiusura della View? – E quello di attivazione? – Come interagiamo con l’utente? • Dialog (dialog owner), MessageBoxes, etc...
  • 10. Iniettiamo anche la ‘I’View... • Se facciamo uso di IoC, ci siamo già in parte tagliati le gambe: class MyViewModel { public MyViewModel( IRepository<Customer> repo ){ ... } } • Tanto vale farlo fino in fondo: class MyViewModel { public MyViewModel( IView view, IRepository<Customer> repo ){ ... } }
  • 11. ...e ‘I’View diventa interface IView { Object DataContext{ get; set; } } interface ICloseableView : IView { event CancelEventHandler Closing; event EventHandler Closed; } Alla fine il nostro compito è consegnare valore non filosofeggiare ;-)
  • 12. È un investimento decisamente onoreso, ne vale la pena? UI COMPOSITION: PERCHÈ?
  • 13. Bella domanda... • Cliente: necessità di modularizzare: – Acquistare in configurazioni diverse; – Installare in configurazioni diverse; • Team: necessità di gestire e lavorare: – Team grande o distribuito; – Soluzione/i di dimensioni ingestibili in VS; – Tempi di sviluppo diversi dei “moduli” che non devono condizionarsi/bloccarsi a vicenda;
  • 14. Ok, chiaro... Ma a che costo? UI COMPOSITION: I PROBLEMI
  • 15. Requisiti: un esempio • Semplice applicazione “gestionale”: – Anagrafiche; – Contabilità; • Il cliente deve poter installare il “modulo” anagrafiche senza la contabilità; • Il team deve poter sviluppare i 2 moduli indipendentemente;
  • 16. Domain Model • Contabilità “dipende” da Anagrafiche? • Dipende... ;-) da che cosa? – Se modularizzo per necessità di sviluppo; – Se modularizzo per necessità di deploy;
  • 17. Semplicità, adesso è tutto così facile... “Region... perchè sei tu region” Toolbars e Documents sono Region in cui poter iniettare contenuti a runtime xxxDetails è una Region in cui poter iniettare contenuti contestuali a runtime
  • 18. Semplicità...adesso un po’ meno... Ecco perchè per mettere M-V-VM al centro del mondo è necessario sporcarsi le mani
  • 19. Region: statiche e dinamiche • Toolbars e Documents sono region “statiche”; – Referenziabili per “nome”; • Ma se avessimo più Window? CustomerWindow: Instance 1 CustomerWindow: Instance 2 “ContentRegion” “ContentRegion” • IRegionManager.GetRegion( name ) ? • svc.RegisterRegion( name, view ); • svc.GetManager( view ).GetRegion( name );
  • 20. Come comunicano? Una toolbar contestuale l’elemento selezionato deve compare quando visualizziamo “attivare” un Command nella contenuti contestuali toolbar La variazione di selezione deve essere intercettata per iniettare i contenuti contestuali
  • 21. L’ecosistema: è un mondo difficile • L’ecosistema: lunga vita a Visual Studio – la shell; – i moduli; – il processo di bootstrap; • Diligenza assoluta, farsi prendere la mano, e sporcarla, è molto facile ma il rischio è di pagarla cara dopo; • La navigazione e il ciclo di vita dei “documenti”: RunningDocumentsService;
  • 22. Comporre, scomporre e ricomporre questo è il segreto... UI COMPOSITION: LE POSSIBILI SOLUZIONI
  • 23. Il mio Domain Model • Il pericolo è il mio mestiere: • Potreste avere un Repository<T> basato su servizi WCF; • Naturalmente... non si possono fare le join;
  • 24. RegionService, RegionManager, Region • Wpf e Xaml vi danno la massima libertà: lunga vita alle Attached Property; <ContentPresenter rg:RegionService.Region="{rg:ContentPresenterRegion 'myRegionName'}" />
  • 25. Il postino suona sempre 2 volte • I vari attori, aka Module, non si conoscono ma hanno la necessità di comunicare tra loro: – Dobbiamo definire una lingua nota a tutti; – Dobbiamo designare qualcuno come postino;
  • 26. Italiani...! La shell si avvia! • Il nostro postino trasporta messaggi: ViewModelLoading<IShellViewModel>() • che contengono informazioni: var regionManager = this.regionService.GetRegionManager( this.View ); var msg = new ViewModelLoading<IShellViewModel>( this, regionManager ); this.broker.Dispatch( msg ); • che possiamo usare a nostro uso e consumo: this.broker.Subscribe<ViewModelLoading<IShellViewModel>>( this, msg => { var viewModel = this.provider.GetService( typeof( IMyContentViewModel ) ) msg.RegionManager[ "myRegionName" ].Add( viewModel.View ); } );
  • 27. IMessage lifecycle SearchRequestMessage Broker MessageHandler Handler -“Risolve” il ViewModel; - passa le informazione sulla ricerca richiesta; - Inietta la View nella Region; ViewModel -Esegue la ricerca; - Visualizza i risultati;
  • 28. Messaggi o Eventi: l’unione fa la forza • Ingestibili con messaggi: – Attivazione/Disattiva zione Document; – Cambio di selezione; • Gli eventi tornano ad essere vincenti: – Una Region notifica il cambio di contenuto attivo; – Un ViewModel può interagire con il contenuto: – IHandlePrintScenario -> PrintScenarioChanged