SlideShare uma empresa Scribd logo
1 de 43
System.AddIn
La via dell’estensibilità secondo il .NET framework
                               » Mauro Servienti
Who I am...


       Mauro Servienti

                   blog: http://blogs.ugidotnet.org/topics
                  email: mauro@topics.it
                   web: https://mvp.support.microsoft.com/profile/mauro


             community: www.xedotnet.org, www.ugidotnet.org




14/03/2008                         www.xedotnet.org                         2
Upcoming Events


  Community Meeting




             In collaborazione con:




14/03/2008                       www.xedotnet.org              3
Perchè abbiamo bisogno di realizzare applicazioni estensibili.

                         Estensibilità... who cares?
Perchè?



» Supporto per l’integrazione e l’interoperabilità;
» Consente di modificare a caldo il
  comportamento;
» È un’ottimo “strumento” commerciale;




 14/03/2008           www.xedotnet.org                5
Scrivere in ottica estensibilità



» Pensare agli entry point;
» Prevedere quali dati potranno essere necessari;
» Incapsulare i dati in classi adatte al loro
  trasporto:
    • EventArgs;
    • CancelEventArgs;
    • CustomEventArgs : CancelEventArgs/EventArgs
» Le “pipeline”, un esempio da seguire:
    • HttpModule + HttpHanlder;

 14/03/2008             www.xedotnet.org                              6
Un primo approccio al problema

Le dipendenze statiche
il problema: le dipendenze statiche




             Componente                        Componente

             ComA                               ComB




14/03/2008                www.xedotnet.org                                  8
Il cammino verso la soluzione...




Componente    Interfaccia

ComA          IComB



              Componente

              ComB




 14/03/2008                 www.xedotnet.org                               9
Inversion of Control




                                                               Interfaccia
             Componente
                                   ServiceProvider             IComB
             ComA                       (IoC Container)




                                              Componente         IoC
                                              ComB              Config




14/03/2008                www.xedotnet.org                                   10
Inversion of Control



» Elevato supporto per la manutenzione
» Sostituzione dei componenti a caldo
» Supporto esteso per l’estensibilità:
    • Intercepting;
    • Dependency Injection
    • Chain of Responsability
» Ma... IoC si basa sul contratto;

»  Nonostante tutto adoro IoC!
 14/03/2008              www.xedotnet.org                  11
Non avrai altro contratto all’infuori di me.

    Un contratto è per sempre
Problema: le dipendenze



» Entrambe le parti dipendono in maniera statica
  dal contratto;



              Host   Contract           AddIn




                                                Dipendenza Statica




 14/03/2008          www.xedotnet.org                                13
Problema: il versioning del contratto


» Un contratto in quanto tale non dovrebbe
  cambiare nel tempo;
» Sappiamo che nella vita reale questo non è
  sempre vero:
    • Analisi iniziale sbagliata;
    • Condizioni che cambiano;
    • Introduzione di nuove funzionalità che non potevano
      essere previste;
    • Nuova versione dell’applicazione che vuole
      soddisfare nuovi requisiti;
    • Etc...
 14/03/2008              www.xedotnet.org                              14
Adesso che siamo inseparabili possiamo vivere felici?

               Finchè morte non ci separi
Il versioning non è l’unico dei problemi


» Il processo di Discovery;
» L’attivazione degli AddIn;
    • Le dipendenze, da library di terze parti, sia dell’Host
      che dell’AddIn: the AssemblyResolve problem;
» L’isolamento del codice altrui: Sandboxing;
    • La gestione della security;
    • Gestione degli errori nell’AddIn:
              • Il fx 2.0 ha cambiato il comportamento in caso eccezione
                non gestita;
» La gestione del ciclo di vita: Unloading;

 14/03/2008                        www.xedotnet.org                              16
Ma non solo...


» Compatibilità all’indietro:
    • Nuovi Host che hanno bisogno di caricare vecchi AddIn;
» Compatibilità in avanti:
    • Vecchi Host che hanno bisogno di funzionalità fornite da
      nuovi AddIn;
» La necessità di introdurre nuovi livelli di isolamento:
    • In Process;
    • Different AppDomain;
    • Out of Process;


 14/03/2008                www.xedotnet.org                  17
La soluzione proposta dal .NET framework

    System.AddIn: Architettura
Architettura


                                                    Dove eravamo…


                                                         Host       Contract       AddIn
                                   Isolation
                                   Boundary



                       Host                         AddIn
             Host’s                Contract                     AddIn’s
Host                   Side                          Side                        AddIn
             View                                                View
                      Adapter                      Adapter




                                                         Dipendenza statica



14/03/2008                      www.xedotnet.org                                         19
Architettura: la simmetria




                                                     Isolation
                                                     Boundary




             Host/Add-In   View           Adapter    Contract




14/03/2008                        www.xedotnet.org                          20
Architettura: l’attivazione




                                    Isolation
                                    Boundary



             Host’s                                                 AddIn
             View      Host         IContract         AddIn         Base
 Host                                                                             AddIn
              Of      Adapter                        Adapter      (AddIn view
             AddIn                                                 of contract)




                                        Inherits/Implements           Constructor Argument



14/03/2008                      www.xedotnet.org                                        21
La soluzione proposta dal .NET framework

         System.AddIn: il codice
Il contratto




[AddInContract]
public interface IMyContract: IContract
{
    void Execute();
}




14/03/2008         www.xedotnet.org              23
La vista sul contratto



» Host View:
     public interface IMyContractView
     {
         void Execute();
     }

» AddIn View:
     [AddInBase]
     public interface IMyContractView
     {
         void Execute();
     }


» Le View possono essere “SharedViews”;

14/03/2008                 www.xedotnet.org                    24
Gli adattatori: AddIn Side



[AddInAdapter]
public class MyAddInSideAdapter: ContractBase, IMyContract
{
    IMyContractView _contract;

     public MyAddInSideAdapter( IMyContractView contract )
     {
           _contract = contract;
     }

     public void Execute()
     {
           _contract.Execute();
     }
}




14/03/2008                 www.xedotnet.org                        25
Gli adattatori: Host Side


[HostAdapter]
public class MyHostSideAdapter : IMyContractView
{
     IMyContract _contract;
     ContractHandle _handle;

       public MyHostSideAdapter( IMyContract contract )
       {
           _contract = contract;
           _handle = new ContractHandle(contract);
       }

       public void Execute()
       {
           _contract.Execute();
       }
}



14/03/2008                  www.xedotnet.org                       26
“ContractHandle”


» Dato che l’architettura permette agli AddIn di
  comunicare attraverso i confini di un AppDomain (o
  addirittura di un processo) non possiamo fare
  affidamento sul GC per la gestione della memoria.

» Questa classe ci offre un sistema di “reference
  counting” COM Like:
    • Quando viene costruito un ContractHandle nel
      costruttore viene chiamato AcquireLifetimeToken().
    • Quando il ContractHandle viene “disposto” viene
      chiamato RevokeLifetimeToken().

 14/03/2008               www.xedotnet.org                  27
Install  Find  Activate  Unload


» Install:
   AddInStore.Update( path );

» Find:
     IList<AddInToken> tokens = AddInStore.FindAddIns(
               typeof( IMyContractView ),path );

» Activate:
       IMyAddIn addIn = token.Activate( AddInSecurityLevel.Internet );

» Unload:
      AddInController c = AddInController.GetAddInController( addin );
      c.Shutdown();



 14/03/2008                     www.xedotnet.org                            28
Ci proviamo?

Demo: HandMade Solution
E’ tutto chiaro, vero....? 

           Domande?
P.S. Diario di Bordo


» “Folder Naming”: quello è e quello deve essere,
  siamo in V1...;
» L’AddIn può intercettare il suo shutdown:
    • Evento custom esposto dall’host;
    • Distruttore: C# Finalizer
    • AppDomain.UnloadDomain
              • Attenzione alla CAS:
                PermissionSet permSet = new PermissionSet(
                PermissionState.None );
                permSet.AddPermission(
                      new SecurityPermission(
                      SecurityPermissionFlag.ControlAppDomain |
                      SecurityPermissionFlag.Execution ) );


 14/03/2008                         www.xedotnet.org                       31
P.S. Extreme Sandboxing


» È possibile attivare gli AddIn in un processo
  separato:
    • Fornisce massimo supporto per il sandboxing
    • Isola il processo host dalle eventuali exception non
      gestite dall’AddIn:
              • Il CLR del fx 2.0 introduce un radicale cambiamento;
              • È possibile, ma non consigliabile, cambiare questo
                comportamento (via app.config):
                 • configurationruntimelegacyUnhandledExceptionPolicy
                   enabled="1“
» Se usate un processo separato eseguite l’attach
  anche di quello per poter debuggare;
 14/03/2008                          www.xedotnet.org                       32
Gestione delle eccezioni: “unreliable tokens”

      Demo: Extreme SandBoxing
Recap: a che punto siamo...


» Ogni AddIn vive, su disco, nella sua cartella:
   • Con le sue dipendenze;
   • Senza generare conflitti di versione con gli altri AddIn;
   • Con Il proprio faile di configurazione.
» L’host può intercettare gli errori in un AddIn,
  scaricarlo ed eventualmente ricaricarlo senza che
  questo impatti sull’host e sugli altri AddIn;
   • A patto che non giri in un processo separato;
» Gli AddIn possono essere isolati (Sandboxing)
  fornendo un particolare contesto di security;
» Gli AddIn possono essere scaricati liberando risorse;
Tutto bello ma... quanto codice



» Abbiamo scritto troppo plumbing code per
  ottenere il risultato desiderato:
   • Pipeline Builder Tool:
             • Genera tutto il plumbing code in maniera automatica;
   • Pipeline Hint:
             • Ci permette di controllare il Pipeline Builder Tool:
                • SharedView;
                • Commenti;
                • Naming degli Assembly generati;
             • Fornisce supporto per esporre eventi tra Host e AddIn e
               viceversa;

14/03/2008                          www.xedotnet.org                             35
Gestione degli eventi e comunicazione duplex

Demo: Pipeline Builder & Events Handling
E’ tutto chiaro, vero....? 

           Domande?
Il nostro rapporto non è più lo stesso... “cara ti amo” <cit.>

                                   Demo: Versioning
Recap: data astrale....



» Cuore della gestione del versioning sono gli
  adattatori;
» Tutto può essere soggetto a versioning:
  • Contratto degli AddIn;
  • Contratto dell’Host;
  • Contratto dei “dati”;
» Il Pipeline Builder Tool genera adattatori per
  tutto ciò che implementa, nell’assembly del
  contratto l’interfaccia, “IContract”;
Alcune note



» Passaggio di un tipo complesso attraverso i
  confini:
  • Abbiamo a che fare con remoting:
     • Il tipo deve essere serializzabile?
     • Chi è che affettivamente passa i confini?
  • Definire sempre un’interfaccia;
  • Se dobbiamo passare una collection, nel contratto,
    usiamo IListContract<T>:
     • La classe statica CollectionAdapters vi offre facilities per la
       conversione da e verso IList<T>;
Lo sconfinamento di un tipo complesso...

            Demo: ComplexType
E’ tutto chiaro, vero....? 

           Domande?
Si mangia! 

  Grazie!

Mais conteúdo relacionado

Destaque

Inversion of Control @ CD2008
Inversion of Control @ CD2008Inversion of Control @ CD2008
Inversion of Control @ CD2008Mauro Servienti
 
Как да станем софтуерни инженери и да стартираме ИТ бизнес?
Как да станем софтуерни инженери и да стартираме ИТ бизнес?Как да станем софтуерни инженери и да стартираме ИТ бизнес?
Как да станем софтуерни инженери и да стартираме ИТ бизнес?Svetlin Nakov
 
Model-View-ViewModel
Model-View-ViewModelModel-View-ViewModel
Model-View-ViewModelDotNetMarche
 
Работа с Естествен Интелект – Личност – Време – 3 юли 2013 @ НЛП клуб
Работа с Естествен Интелект – Личност – Време – 3 юли 2013 @ НЛП клубРабота с Естествен Интелект – Личност – Време – 3 юли 2013 @ НЛП клуб
Работа с Естествен Интелект – Личност – Време – 3 юли 2013 @ НЛП клубSvetlin Nakov
 
Regular Expressions: QA Challenge Accepted Conf (March 2015)
Regular Expressions: QA Challenge Accepted Conf (March 2015)Regular Expressions: QA Challenge Accepted Conf (March 2015)
Regular Expressions: QA Challenge Accepted Conf (March 2015)Svetlin Nakov
 
Architetttura Della Soluzione
Architetttura Della SoluzioneArchitetttura Della Soluzione
Architetttura Della SoluzioneLuca Milan
 
Entity Framework: Nakov @ BFU Hackhaton 2015
Entity Framework: Nakov @ BFU Hackhaton 2015Entity Framework: Nakov @ BFU Hackhaton 2015
Entity Framework: Nakov @ BFU Hackhaton 2015Svetlin Nakov
 
Architectural Patterns and Software Architectures: Client-Server, Multi-Tier,...
Architectural Patterns and Software Architectures: Client-Server, Multi-Tier,...Architectural Patterns and Software Architectures: Client-Server, Multi-Tier,...
Architectural Patterns and Software Architectures: Client-Server, Multi-Tier,...Svetlin Nakov
 
Design pattern architetturali Model View Controller, MVP e MVVM
Design pattern architetturali   Model View Controller, MVP e MVVMDesign pattern architetturali   Model View Controller, MVP e MVVM
Design pattern architetturali Model View Controller, MVP e MVVMRiccardo Cardin
 
Design Pattern Architetturali - Dependency Injection
Design Pattern Architetturali - Dependency InjectionDesign Pattern Architetturali - Dependency Injection
Design Pattern Architetturali - Dependency InjectionRiccardo Cardin
 

Destaque (15)

Inversion of Control @ CD2008
Inversion of Control @ CD2008Inversion of Control @ CD2008
Inversion of Control @ CD2008
 
Как да станем софтуерни инженери и да стартираме ИТ бизнес?
Как да станем софтуерни инженери и да стартираме ИТ бизнес?Как да станем софтуерни инженери и да стартираме ИТ бизнес?
Как да станем софтуерни инженери и да стартираме ИТ бизнес?
 
Model-View-ViewModel
Model-View-ViewModelModel-View-ViewModel
Model-View-ViewModel
 
Работа с Естествен Интелект – Личност – Време – 3 юли 2013 @ НЛП клуб
Работа с Естествен Интелект – Личност – Време – 3 юли 2013 @ НЛП клубРабота с Естествен Интелект – Личност – Време – 3 юли 2013 @ НЛП клуб
Работа с Естествен Интелект – Личност – Време – 3 юли 2013 @ НЛП клуб
 
Regular Expressions: QA Challenge Accepted Conf (March 2015)
Regular Expressions: QA Challenge Accepted Conf (March 2015)Regular Expressions: QA Challenge Accepted Conf (March 2015)
Regular Expressions: QA Challenge Accepted Conf (March 2015)
 
Architetttura Della Soluzione
Architetttura Della SoluzioneArchitetttura Della Soluzione
Architetttura Della Soluzione
 
UI Composition
UI CompositionUI Composition
UI Composition
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 
Entity Framework: Nakov @ BFU Hackhaton 2015
Entity Framework: Nakov @ BFU Hackhaton 2015Entity Framework: Nakov @ BFU Hackhaton 2015
Entity Framework: Nakov @ BFU Hackhaton 2015
 
Introduzione WPF
Introduzione WPFIntroduzione WPF
Introduzione WPF
 
WPF MVVM Toolkit
WPF MVVM ToolkitWPF MVVM Toolkit
WPF MVVM Toolkit
 
Architectural Patterns and Software Architectures: Client-Server, Multi-Tier,...
Architectural Patterns and Software Architectures: Client-Server, Multi-Tier,...Architectural Patterns and Software Architectures: Client-Server, Multi-Tier,...
Architectural Patterns and Software Architectures: Client-Server, Multi-Tier,...
 
Design pattern architetturali Model View Controller, MVP e MVVM
Design pattern architetturali   Model View Controller, MVP e MVVMDesign pattern architetturali   Model View Controller, MVP e MVVM
Design pattern architetturali Model View Controller, MVP e MVVM
 
Design Pattern Architetturali - Dependency Injection
Design Pattern Architetturali - Dependency InjectionDesign Pattern Architetturali - Dependency Injection
Design Pattern Architetturali - Dependency Injection
 
Layered Software Architecture
Layered Software ArchitectureLayered Software Architecture
Layered Software Architecture
 

Semelhante a System.AddIn @ Xe.Net

Introduzione ai framework ioc
Introduzione ai framework iocIntroduzione ai framework ioc
Introduzione ai framework iocAndrea Balducci
 
Modernize Legacy Systems with Kubernetes
Modernize Legacy Systems with KubernetesModernize Legacy Systems with Kubernetes
Modernize Legacy Systems with KubernetesGiulio Roggero
 
Evento 18 giugno - Demo VMP
Evento 18 giugno - Demo VMPEvento 18 giugno - Demo VMP
Evento 18 giugno - Demo VMPPRAGMA PROGETTI
 
Creazione di una partizione Linux ospitata da IBM i tramite VPM
Creazione di una partizione Linux ospitata da IBM i tramite VPMCreazione di una partizione Linux ospitata da IBM i tramite VPM
Creazione di una partizione Linux ospitata da IBM i tramite VPMS.info Srl
 
IBM Software Conference 2012 - Cloud
IBM Software Conference 2012 - CloudIBM Software Conference 2012 - Cloud
IBM Software Conference 2012 - CloudFilippo Antonelli
 
Introduzione a Internet (1/2) - 18/19
Introduzione a Internet (1/2) - 18/19Introduzione a Internet (1/2) - 18/19
Introduzione a Internet (1/2) - 18/19Giuseppe Vizzari
 
Hybrid development using Qt webkit
Hybrid development using Qt webkitHybrid development using Qt webkit
Hybrid development using Qt webkitDeveler S.r.l.
 
Ai & Ethereum the world computer
Ai & Ethereum the world computerAi & Ethereum the world computer
Ai & Ethereum the world computerGioacchino Vaiana
 
Qt roadmap: the future of Qt
Qt roadmap: the future of QtQt roadmap: the future of Qt
Qt roadmap: the future of QtDeveler S.r.l.
 
JXTA.it - comunità Italiana giustapposta
JXTA.it - comunità Italiana giustappostaJXTA.it - comunità Italiana giustapposta
JXTA.it - comunità Italiana giustappostaorigama
 
Generazione automatica diagrammi di rete con template pptx
Generazione automatica diagrammi di rete con template pptxGenerazione automatica diagrammi di rete con template pptx
Generazione automatica diagrammi di rete con template pptxGiacomoZorzin
 
Intervista di Marco Bavazzano a Il Mondo
Intervista di Marco Bavazzano a Il Mondo Intervista di Marco Bavazzano a Il Mondo
Intervista di Marco Bavazzano a Il Mondo Marco Bavazzano
 
Webkit presentazione ufficiale
Webkit presentazione ufficialeWebkit presentazione ufficiale
Webkit presentazione ufficialeintoinside
 
ICT: dall'impresa alla PA e ritorno. Racconto di un'esperienza vissuta
ICT: dall'impresa alla PA e ritorno. Racconto di un'esperienza vissutaICT: dall'impresa alla PA e ritorno. Racconto di un'esperienza vissuta
ICT: dall'impresa alla PA e ritorno. Racconto di un'esperienza vissutaMassimo Carnevali
 
Il web service e i sistemi embedded - Tesi - cap2
Il web service e i sistemi embedded - Tesi - cap2Il web service e i sistemi embedded - Tesi - cap2
Il web service e i sistemi embedded - Tesi - cap2pma77
 
2 - Introduzione ad Internet (1/2)
2 - Introduzione ad Internet (1/2)2 - Introduzione ad Internet (1/2)
2 - Introduzione ad Internet (1/2)Giuseppe Vizzari
 
La convergenza delle tecnologie
La convergenza delle tecnologieLa convergenza delle tecnologie
La convergenza delle tecnologieTOP-IX Consortium
 

Semelhante a System.AddIn @ Xe.Net (20)

Introduzione ai framework ioc
Introduzione ai framework iocIntroduzione ai framework ioc
Introduzione ai framework ioc
 
Modernize Legacy Systems with Kubernetes
Modernize Legacy Systems with KubernetesModernize Legacy Systems with Kubernetes
Modernize Legacy Systems with Kubernetes
 
Jipday Portletjsr168
Jipday Portletjsr168Jipday Portletjsr168
Jipday Portletjsr168
 
Kotlin hexagonal-architecture
Kotlin hexagonal-architectureKotlin hexagonal-architecture
Kotlin hexagonal-architecture
 
Evento 18 giugno - Demo VMP
Evento 18 giugno - Demo VMPEvento 18 giugno - Demo VMP
Evento 18 giugno - Demo VMP
 
Creazione di una partizione Linux ospitata da IBM i tramite VPM
Creazione di una partizione Linux ospitata da IBM i tramite VPMCreazione di una partizione Linux ospitata da IBM i tramite VPM
Creazione di una partizione Linux ospitata da IBM i tramite VPM
 
IBM Software Conference 2012 - Cloud
IBM Software Conference 2012 - CloudIBM Software Conference 2012 - Cloud
IBM Software Conference 2012 - Cloud
 
Introduzione a Internet (1/2) - 18/19
Introduzione a Internet (1/2) - 18/19Introduzione a Internet (1/2) - 18/19
Introduzione a Internet (1/2) - 18/19
 
Hybrid development using Qt webkit
Hybrid development using Qt webkitHybrid development using Qt webkit
Hybrid development using Qt webkit
 
Ai & Ethereum the world computer
Ai & Ethereum the world computerAi & Ethereum the world computer
Ai & Ethereum the world computer
 
Qt roadmap: the future of Qt
Qt roadmap: the future of QtQt roadmap: the future of Qt
Qt roadmap: the future of Qt
 
JXTA.it - comunità Italiana giustapposta
JXTA.it - comunità Italiana giustappostaJXTA.it - comunità Italiana giustapposta
JXTA.it - comunità Italiana giustapposta
 
Generazione automatica diagrammi di rete con template pptx
Generazione automatica diagrammi di rete con template pptxGenerazione automatica diagrammi di rete con template pptx
Generazione automatica diagrammi di rete con template pptx
 
Intervista di Marco Bavazzano a Il Mondo
Intervista di Marco Bavazzano a Il Mondo Intervista di Marco Bavazzano a Il Mondo
Intervista di Marco Bavazzano a Il Mondo
 
SIMarket_Massimo La Morgia
SIMarket_Massimo La MorgiaSIMarket_Massimo La Morgia
SIMarket_Massimo La Morgia
 
Webkit presentazione ufficiale
Webkit presentazione ufficialeWebkit presentazione ufficiale
Webkit presentazione ufficiale
 
ICT: dall'impresa alla PA e ritorno. Racconto di un'esperienza vissuta
ICT: dall'impresa alla PA e ritorno. Racconto di un'esperienza vissutaICT: dall'impresa alla PA e ritorno. Racconto di un'esperienza vissuta
ICT: dall'impresa alla PA e ritorno. Racconto di un'esperienza vissuta
 
Il web service e i sistemi embedded - Tesi - cap2
Il web service e i sistemi embedded - Tesi - cap2Il web service e i sistemi embedded - Tesi - cap2
Il web service e i sistemi embedded - Tesi - cap2
 
2 - Introduzione ad Internet (1/2)
2 - Introduzione ad Internet (1/2)2 - Introduzione ad Internet (1/2)
2 - Introduzione ad Internet (1/2)
 
La convergenza delle tecnologie
La convergenza delle tecnologieLa convergenza delle tecnologie
La convergenza delle tecnologie
 

Mais 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
 

Mais 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
 

Último

Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoQuotidiano Piemontese
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Associazione Digital Days
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Associazione Digital Days
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Associazione Digital Days
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Associazione Digital Days
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Associazione Digital Days
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Associazione Digital Days
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Associazione Digital Days
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Associazione Digital Days
 

Último (9)

Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 Torino
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
 

System.AddIn @ Xe.Net

  • 1. System.AddIn La via dell’estensibilità secondo il .NET framework » Mauro Servienti
  • 2. Who I am... Mauro Servienti blog: http://blogs.ugidotnet.org/topics email: mauro@topics.it web: https://mvp.support.microsoft.com/profile/mauro community: www.xedotnet.org, www.ugidotnet.org 14/03/2008 www.xedotnet.org 2
  • 3. Upcoming Events Community Meeting In collaborazione con: 14/03/2008 www.xedotnet.org 3
  • 4. Perchè abbiamo bisogno di realizzare applicazioni estensibili. Estensibilità... who cares?
  • 5. Perchè? » Supporto per l’integrazione e l’interoperabilità; » Consente di modificare a caldo il comportamento; » È un’ottimo “strumento” commerciale; 14/03/2008 www.xedotnet.org 5
  • 6. Scrivere in ottica estensibilità » Pensare agli entry point; » Prevedere quali dati potranno essere necessari; » Incapsulare i dati in classi adatte al loro trasporto: • EventArgs; • CancelEventArgs; • CustomEventArgs : CancelEventArgs/EventArgs » Le “pipeline”, un esempio da seguire: • HttpModule + HttpHanlder; 14/03/2008 www.xedotnet.org 6
  • 7. Un primo approccio al problema Le dipendenze statiche
  • 8. il problema: le dipendenze statiche Componente Componente ComA ComB 14/03/2008 www.xedotnet.org 8
  • 9. Il cammino verso la soluzione... Componente Interfaccia ComA IComB Componente ComB 14/03/2008 www.xedotnet.org 9
  • 10. Inversion of Control Interfaccia Componente ServiceProvider IComB ComA (IoC Container) Componente IoC ComB Config 14/03/2008 www.xedotnet.org 10
  • 11. Inversion of Control » Elevato supporto per la manutenzione » Sostituzione dei componenti a caldo » Supporto esteso per l’estensibilità: • Intercepting; • Dependency Injection • Chain of Responsability » Ma... IoC si basa sul contratto; »  Nonostante tutto adoro IoC! 14/03/2008 www.xedotnet.org 11
  • 12. Non avrai altro contratto all’infuori di me. Un contratto è per sempre
  • 13. Problema: le dipendenze » Entrambe le parti dipendono in maniera statica dal contratto; Host Contract AddIn Dipendenza Statica 14/03/2008 www.xedotnet.org 13
  • 14. Problema: il versioning del contratto » Un contratto in quanto tale non dovrebbe cambiare nel tempo; » Sappiamo che nella vita reale questo non è sempre vero: • Analisi iniziale sbagliata; • Condizioni che cambiano; • Introduzione di nuove funzionalità che non potevano essere previste; • Nuova versione dell’applicazione che vuole soddisfare nuovi requisiti; • Etc... 14/03/2008 www.xedotnet.org 14
  • 15. Adesso che siamo inseparabili possiamo vivere felici? Finchè morte non ci separi
  • 16. Il versioning non è l’unico dei problemi » Il processo di Discovery; » L’attivazione degli AddIn; • Le dipendenze, da library di terze parti, sia dell’Host che dell’AddIn: the AssemblyResolve problem; » L’isolamento del codice altrui: Sandboxing; • La gestione della security; • Gestione degli errori nell’AddIn: • Il fx 2.0 ha cambiato il comportamento in caso eccezione non gestita; » La gestione del ciclo di vita: Unloading; 14/03/2008 www.xedotnet.org 16
  • 17. Ma non solo... » Compatibilità all’indietro: • Nuovi Host che hanno bisogno di caricare vecchi AddIn; » Compatibilità in avanti: • Vecchi Host che hanno bisogno di funzionalità fornite da nuovi AddIn; » La necessità di introdurre nuovi livelli di isolamento: • In Process; • Different AppDomain; • Out of Process; 14/03/2008 www.xedotnet.org 17
  • 18. La soluzione proposta dal .NET framework System.AddIn: Architettura
  • 19. Architettura Dove eravamo… Host Contract AddIn Isolation Boundary Host AddIn Host’s Contract AddIn’s Host Side Side AddIn View View Adapter Adapter Dipendenza statica 14/03/2008 www.xedotnet.org 19
  • 20. Architettura: la simmetria Isolation Boundary Host/Add-In View Adapter Contract 14/03/2008 www.xedotnet.org 20
  • 21. Architettura: l’attivazione Isolation Boundary Host’s AddIn View Host IContract AddIn Base Host AddIn Of Adapter Adapter (AddIn view AddIn of contract) Inherits/Implements Constructor Argument 14/03/2008 www.xedotnet.org 21
  • 22. La soluzione proposta dal .NET framework System.AddIn: il codice
  • 23. Il contratto [AddInContract] public interface IMyContract: IContract { void Execute(); } 14/03/2008 www.xedotnet.org 23
  • 24. La vista sul contratto » Host View: public interface IMyContractView { void Execute(); } » AddIn View: [AddInBase] public interface IMyContractView { void Execute(); } » Le View possono essere “SharedViews”; 14/03/2008 www.xedotnet.org 24
  • 25. Gli adattatori: AddIn Side [AddInAdapter] public class MyAddInSideAdapter: ContractBase, IMyContract { IMyContractView _contract; public MyAddInSideAdapter( IMyContractView contract ) { _contract = contract; } public void Execute() { _contract.Execute(); } } 14/03/2008 www.xedotnet.org 25
  • 26. Gli adattatori: Host Side [HostAdapter] public class MyHostSideAdapter : IMyContractView { IMyContract _contract; ContractHandle _handle; public MyHostSideAdapter( IMyContract contract ) { _contract = contract; _handle = new ContractHandle(contract); } public void Execute() { _contract.Execute(); } } 14/03/2008 www.xedotnet.org 26
  • 27. “ContractHandle” » Dato che l’architettura permette agli AddIn di comunicare attraverso i confini di un AppDomain (o addirittura di un processo) non possiamo fare affidamento sul GC per la gestione della memoria. » Questa classe ci offre un sistema di “reference counting” COM Like: • Quando viene costruito un ContractHandle nel costruttore viene chiamato AcquireLifetimeToken(). • Quando il ContractHandle viene “disposto” viene chiamato RevokeLifetimeToken(). 14/03/2008 www.xedotnet.org 27
  • 28. Install  Find  Activate  Unload » Install: AddInStore.Update( path ); » Find: IList<AddInToken> tokens = AddInStore.FindAddIns( typeof( IMyContractView ),path ); » Activate: IMyAddIn addIn = token.Activate( AddInSecurityLevel.Internet ); » Unload: AddInController c = AddInController.GetAddInController( addin ); c.Shutdown(); 14/03/2008 www.xedotnet.org 28
  • 30. E’ tutto chiaro, vero....?  Domande?
  • 31. P.S. Diario di Bordo » “Folder Naming”: quello è e quello deve essere, siamo in V1...; » L’AddIn può intercettare il suo shutdown: • Evento custom esposto dall’host; • Distruttore: C# Finalizer • AppDomain.UnloadDomain • Attenzione alla CAS: PermissionSet permSet = new PermissionSet( PermissionState.None ); permSet.AddPermission( new SecurityPermission( SecurityPermissionFlag.ControlAppDomain | SecurityPermissionFlag.Execution ) ); 14/03/2008 www.xedotnet.org 31
  • 32. P.S. Extreme Sandboxing » È possibile attivare gli AddIn in un processo separato: • Fornisce massimo supporto per il sandboxing • Isola il processo host dalle eventuali exception non gestite dall’AddIn: • Il CLR del fx 2.0 introduce un radicale cambiamento; • È possibile, ma non consigliabile, cambiare questo comportamento (via app.config): • configurationruntimelegacyUnhandledExceptionPolicy enabled="1“ » Se usate un processo separato eseguite l’attach anche di quello per poter debuggare; 14/03/2008 www.xedotnet.org 32
  • 33. Gestione delle eccezioni: “unreliable tokens” Demo: Extreme SandBoxing
  • 34. Recap: a che punto siamo... » Ogni AddIn vive, su disco, nella sua cartella: • Con le sue dipendenze; • Senza generare conflitti di versione con gli altri AddIn; • Con Il proprio faile di configurazione. » L’host può intercettare gli errori in un AddIn, scaricarlo ed eventualmente ricaricarlo senza che questo impatti sull’host e sugli altri AddIn; • A patto che non giri in un processo separato; » Gli AddIn possono essere isolati (Sandboxing) fornendo un particolare contesto di security; » Gli AddIn possono essere scaricati liberando risorse;
  • 35. Tutto bello ma... quanto codice » Abbiamo scritto troppo plumbing code per ottenere il risultato desiderato: • Pipeline Builder Tool: • Genera tutto il plumbing code in maniera automatica; • Pipeline Hint: • Ci permette di controllare il Pipeline Builder Tool: • SharedView; • Commenti; • Naming degli Assembly generati; • Fornisce supporto per esporre eventi tra Host e AddIn e viceversa; 14/03/2008 www.xedotnet.org 35
  • 36. Gestione degli eventi e comunicazione duplex Demo: Pipeline Builder & Events Handling
  • 37. E’ tutto chiaro, vero....?  Domande?
  • 38. Il nostro rapporto non è più lo stesso... “cara ti amo” <cit.> Demo: Versioning
  • 39. Recap: data astrale.... » Cuore della gestione del versioning sono gli adattatori; » Tutto può essere soggetto a versioning: • Contratto degli AddIn; • Contratto dell’Host; • Contratto dei “dati”; » Il Pipeline Builder Tool genera adattatori per tutto ciò che implementa, nell’assembly del contratto l’interfaccia, “IContract”;
  • 40. Alcune note » Passaggio di un tipo complesso attraverso i confini: • Abbiamo a che fare con remoting: • Il tipo deve essere serializzabile? • Chi è che affettivamente passa i confini? • Definire sempre un’interfaccia; • Se dobbiamo passare una collection, nel contratto, usiamo IListContract<T>: • La classe statica CollectionAdapters vi offre facilities per la conversione da e verso IList<T>;
  • 41. Lo sconfinamento di un tipo complesso... Demo: ComplexType
  • 42. E’ tutto chiaro, vero....?  Domande?
  • 43. Si mangia!  Grazie!

Notas do Editor

  1. Demo: Creazione &quot;amanuense&quot; Crea la solution vuota Creazione del progetto dei contratti aggiunta del contratto aggiunta delle reference a System.AddIn fagli notare che sono compilati per la 2.0 inheritance da IContract marcatura con l&apos;attributo [System.AddIn.Pipeline.AddInContract()] Aggiunta di un metodo impostazione dell&apos;output della build (..\\output\\contracts\\) Aggiungiamo un progetto per le &quot;Shared&quot; view impostiamo l&apos;output (..\\output\\AddInViews\\) aggiungiamo una interfaccia IMySampleContractView aggiungiamo le reference a System.AddIn marchiamo l&apos;interfaccia con [System.AddIn.Pipeline.AddInBaseAttribute()] Creiamo l&apos;adapter lato addin impostiamo l&apos;output su (..\\output\\AddInSideAdapters\\) Aggiungiamo le reference a System.AddIn Aggiungiamo le reference al contratto e alla view Aggiungiamo una classe per l&apos;adapter: IMySampleContractView_ViewToContract_AddInAdapter marchiamo la classe con l&apos;attributo [System.AddIn.Pipeline.AddInAdapterAttribute()] deriviamo da: : System.AddIn.Pipeline.ContractBase implementiamo l&apos;interfaccia del nostro contratto originale: AddIn.HandMade.Contract.IMySampleContract Aggiungiamo un costruttore che prenda in pasto la &quot;view&quot; (Shared in questo caso) e la salva in un field l&apos;implementazione dell&apos;interfaccia non farà altro che runculare la chiamata sulla view privata Creiamo il progetto per l&apos;addin aggiungiamo la classe per l&apos;addin aggiungiamo le reference a System.AddIn aggiungiamo la reference alle View (Shared) !!!!impostiamo copy local a false marchiamo l&apos;addin con: [System.AddIn.AddIn( &quot;NomeAddIn&quot; )] impostiamo l&apos;output su: ..\\output\\addins\\NomeAddIn\\ implementiamo l&apos;interfaccia della Shared View Creiamo l&apos;adattatore lato host impostiamo l&apos;output su: (..\\output\\HostSideAdapters\\) aggiungiamo le reference a System.AddIn Aggiungiamo le reference al contratto e alla view creiamo la classe per adattare dal contratto alla view: IMySampleContract_ContractToView_HostAdapter marchiamo con [System.AddIn.Pipeline.HostAdapterAttribute()] aggiungiamo un costruttore che prende una reference al contratto e lo adatta alla view implementiamo l&apos;interfaccia della View creiamo l&apos;handle System.AddIn.Pipeline.ContractHandle passandogli una reference al contratto (che è poi il transparent proxy di remoting creiamo il progetto Console per l&apos;host aggiungiamo le reference a System.AddIn aggiungiamo la reference alla sharedview Aggiungiamo un po&apos; di codice: - list di backend IList&lt;IMySampleContractView&gt; addins = new List&lt;IMySampleContractView&gt;(); - ricerca e attivazione String[] result = AddInStore.Update( PipelineStoreLocation.ApplicationBase ); IList&lt;AddInToken&gt; tokens = AddInStore.FindAddIns( typeof( IMySampleContractView ), PipelineStoreLocation.ApplicationBase ); foreach( AddInToken token in tokens ) { addins.Add( token.Activate&lt;IMySampleContractView&gt;( AddInSecurityLevel.Internet ) ); } - invocazione foreach( IMySampleContractView addin in addins ) { addin.Execute(); } impostazione dell&apos;output: (..\\output\\) impostazione dello startup project breakpoint sull&apos;host e sull&apos;addint F5
  2. Demo: Creazione &quot;amanuense&quot; Crea la solution vuota Creazione del progetto dei contratti aggiunta del contratto aggiunta delle reference a System.AddIn fagli notare che sono compilati per la 2.0 inheritance da IContract marcatura con l&apos;attributo [System.AddIn.Pipeline.AddInContract()] Aggiunta di un metodo impostazione dell&apos;output della build (..\\output\\contracts\\) Aggiungiamo un progetto per le &quot;Shared&quot; view impostiamo l&apos;output (..\\output\\AddInViews\\) aggiungiamo una interfaccia IMySampleContractView aggiungiamo le reference a System.AddIn marchiamo l&apos;interfaccia con [System.AddIn.Pipeline.AddInBaseAttribute()] Creiamo l&apos;adapter lato addin impostiamo l&apos;output su (..\\output\\AddInSideAdapters\\) Aggiungiamo le reference a System.AddIn Aggiungiamo le reference al contratto e alla view Aggiungiamo una classe per l&apos;adapter: IMySampleContractView_ViewToContract_AddInAdapter marchiamo la classe con l&apos;attributo [System.AddIn.Pipeline.AddInAdapterAttribute()] deriviamo da: : System.AddIn.Pipeline.ContractBase implementiamo l&apos;interfaccia del nostro contratto originale: AddIn.HandMade.Contract.IMySampleContract Aggiungiamo un costruttore che prenda in pasto la &quot;view&quot; (Shared in questo caso) e la salva in un field l&apos;implementazione dell&apos;interfaccia non farà altro che runculare la chiamata sulla view privata Creiamo il progetto per l&apos;addin aggiungiamo la classe per l&apos;addin aggiungiamo le reference a System.AddIn aggiungiamo la reference alle View (Shared) !!!!impostiamo copy local a false marchiamo l&apos;addin con: [System.AddIn.AddIn( &quot;NomeAddIn&quot; )] impostiamo l&apos;output su: ..\\output\\addins\\NomeAddIn\\ implementiamo l&apos;interfaccia della Shared View Creiamo l&apos;adattatore lato host impostiamo l&apos;output su: (..\\output\\HostSideAdapters\\) aggiungiamo le reference a System.AddIn Aggiungiamo le reference al contratto e alla view creiamo la classe per adattare dal contratto alla view: IMySampleContract_ContractToView_HostAdapter marchiamo con [System.AddIn.Pipeline.HostAdapterAttribute()] aggiungiamo un costruttore che prende una reference al contratto e lo adatta alla view implementiamo l&apos;interfaccia della View creiamo l&apos;handle System.AddIn.Pipeline.ContractHandle passandogli una reference al contratto (che è poi il transparent proxy di remoting creiamo il progetto Console per l&apos;host aggiungiamo le reference a System.AddIn aggiungiamo la reference alla sharedview Aggiungiamo un po&apos; di codice: - list di backend IList&lt;IMySampleContractView&gt; addins = new List&lt;IMySampleContractView&gt;(); - ricerca e attivazione String[] result = AddInStore.Update( PipelineStoreLocation.ApplicationBase ); IList&lt;AddInToken&gt; tokens = AddInStore.FindAddIns( typeof( IMySampleContractView ), PipelineStoreLocation.ApplicationBase ); foreach( AddInToken token in tokens ) { addins.Add( token.Activate&lt;IMySampleContractView&gt;( AddInSecurityLevel.Internet ) ); } - invocazione foreach( IMySampleContractView addin in addins ) { addin.Execute(); } impostazione dell&apos;output: (..\\output\\) impostazione dello startup project breakpoint sull&apos;host e sull&apos;addint F5