Upload
raffaele-fanizzi
View
1.021
Download
0
Tags:
Embed Size (px)
DESCRIPTION
Citation preview
Dependency Injection
Raffaele Fanizziwww.skyraysolutions.comVicepresidente e Technical Architect, Skyray Solutions SRLMCPD & MCTS
Agenda
o Dependency Injection
o Introduzione a Unity
o Configurazione di Unity
o Uso di Unity
o Un esempio pratico
o Altre potenzialità
o Q&A
Dependency Injection
o Cosa è la Dependency Injection?
o E’ una tecnica della programmazione orientata agli oggetti
o A cosa serve?
o Risolvere le dipendenze tra le componenti
o Favorire il disaccoppiamento tra le componenti
Dependency Injection
High Couplingo Dipendenza stretta tra le
componenti
o Scarsa possibilità di modificare e/o sostituire una componente contenendo l’impatto sul resto del sistema
o Scarsa possibilità di realizzare un’applicazione testabile
o Facile da implementare: va a braccetto con la programmazione mediante “spaghetti code”
ClasseMainWindow
ClassePersonProvider
ClasseMessageManag
er
Dependency Injection
o High Coupling => Low Couplingo Si usano le interfacce per esporre le
funzionalità delle componentio Ogni componente implementerà una o
più interfacce e richiamerà le altre componenti mediante le loro interfacce
o Ogni componente non sa nulla di come funzionano le altre, ma ne conosce esclusivamente l’interfaccia
Dependency Injection
o High Coupling => Low Coupling
Dependency Injection
Low Couplingo Dipendenza tra le
componenti limitatao Possibilità di modificare e/o
sostituire una componente contenendo l’impatto sul resto del sistema
o Possibilità di sostituire le implementazioni per realizzare casi di test
o Non così semplice da implementare: richiede un minimo di progettazione del software
Classe
PersonViewModel
InterfacciaIPersonProvider
InterfacciaIMessageManag
er
???
Referenzia
Risolve le referenze Classe
PersonProvider
ClasseMessageManage
r
Crea
Dependency Injection
o Il low coupling introduce due problemi:
o chi e come vengono associate le interfacce alle implementazioni?
o Un Inversion of Control (IoC) Container ha il compito di rilevare le dipendenze di una componente e di “inniettarle”, risolvendo l’associazione tra interfacce ed implementazione
o Cosa si intende con Inversion of Control? Quale è la logica di controllo che viene invertita?
o La risposta è: la logica di creazione delle istanze
Dependency Injection
o Come possono essere iniettate le dipendenze?
o Constructor Injection
o Property o Setter Injection
o Method Call Injection
Dependency Injection
o Constructor Injectiono Le componenti vengono iniettate dall’IoC Container
attraverso il costruttore
Dependency Injection
o Property o Setter Injection
o Le componenti vengono iniettate dall’IoC Container richiamando il setter di alcune proprietà
Dependency Injection
o Method Call Injection
o Le componenti vengono iniettate dall’IoC Container richiamando un metodo
Dependency Injection
o Al crescere della complessità di un software, del numero di classi e del disaccoppiamento, la risoluzione delle dipendenze diventa un problema
Introduzione a Unity
o E’ una libreria sviluppata da Microsoft che si occupa di implementare le seguenti funzionalità:
o Dependency Injection
o Interception
o L’attuale versione 2.0 è stata integrata nell’Enterprise Library 5.0
o Può essere adottata in qualsiasi progetto .NET 3.5/4.0 o Silverlight
o E’ open source rilasciata sotto licenza Microsoft Public License
Configurazione di Unity
o Unity può essere configurato in due modi:
o Programmaticamente
o File di configurazione (.config)
o Qual è l’aspetto più importante da configurare per un IoC Container?
o Mapping tra le interfacce e le classi che le implementano
Configurazione di Unity
o Possibili scenari di mapping tra le interfacce e le classi
Mapping 1-1
L’interfaccia va mappata su una sola classe
Configurazione di Unity
o Possibili scenari di mapping tra le interfacce e le classi
Mapping 1-N
L’interfaccia va mappata su più classi
Uso di Unity
o Per usare Unity è sufficiente creare un’istanza della classe UnityContainer ed utilizzarla per risolvere gli oggetti di cui abbiamo bisogno mediante il metodo Resolve
o Il metodo Resolve accetta in input qualsiasi tipo
o Se il tipo è un’interfaccia, utilizza la configurazione per tentare di risolverla e, se necessario, ne esegue la Dependency Injection
o Se il tipo è una classe se è necessario, ne esegue la Dependency Injection
Uso di Unity
o Constructor Injection (default)
Caso Comportamento
Un solo costruttore Unity richiama l’unico costruttore disponibile
Un solo costruttore, ma è necessario specificare il nome della risoluzione da attuare
Unity richiama l’unico costruttore disponibile e utilizza l’attributo [Dependency(“name”)] per capire come risolvere il tipo
Più costruttori Unity richiama il costruttore decorato con l’attributo [InjectionConstructor] o, se manca, quello con il maggior numero di parametri
Uso di Unity
o Constructor Injection (default)
Uso di Unity
o Property o Setter Injection
Caso Comportamento
Proprietà senza specificare il nome della risoluzione da attuare
Unity richiama il setter delle proprietà con l’attributo [Dependency], risolvendole con l’unico tipo mappato sul tipo della proprietà
Proprietà specificando il nome della risoluzione da attuare
Unity richiama il setter delle proprietà con l’attributo [Dependency(“name”)], risolvendole con il tipo mappato sul tipo della proprietà in base al nome della risoluzione
Proprietà la cui risoluzione è opzionale
Unity richiama il setter delle proprietà con l’attributo [OptionalDependency] e, se non riesce a risolverle, le imposta a null
Uso di Unity
o Property o Setter Injection
Uso di Unity
o Method Injection
Caso Comportamento
Senza specificare un nome per la risoluzione delle dipendenze
Unity esegue il metodo decorato con l’attributo [InjectionMethod], eseguendo l’Injection dei parametri di questo metodo
Specificando un nome per la risoluzione delle dipendenze
Unity esegue il metodo decorato con l’attributo [InjectionMethod], eseguendo l’Injection dei parametri di questo metodo utilizzando, per ogni parametro, il nome definito con l’attributo [Dependency(“name”)]
Uso di Unity
o Method Injection
Uso di Unity
o Constructor vs Property Injection vs Method Injection, chi vince?
o Secondo me la Constructor Injection perché…
o La Constructor Injection è l’unico tipo di injection che, potenzialmente, non richiede la decorazione con attributi custom di Unity
o Vi permette di astrarvi dallo specifico IoC Container
o La Property Injection e la Method Injection richiedono l’uso obbligatorio dell’attributo di Unity e obbligano l’esposizione di una proprietà o di un metodo pubblico per consentire l’Injection
Uso di Unity
o Altre funzionalità utili
o Metodo RegisterInstance
o Consente di registrare un’istanza di una classe già esistente nel container
o Metodo BuildUp
o Consente di eseguire la Dependency Injection (solo Setter e Method Injection) di un’istanza creata esternamente all’IoC Container
o Metodo ResolveAll
o Consente di risolvere tutte le classi registrate per una determinata interfaccia
Un esempio praticoo Applied Pattern V1 – Spaghetti Code
o Applied Pattern V2 – Components
o Applied Pattern V3 – MVVM
o Applied Pattern V4 – Dependency Injection
Altre potenzialità
o Lifetime Management
o Pattern Singleton
o Aspect Oriented Programming
o Volete vederne un esempio ?
Risorse
o MSDNhttp://msdn.microsoft.com
o Dependency Injection e IoC Containerhttp://martinfowler.com/articles/injection.html
o Unityhttp://unity.codeplex.com/
o DotNetSidehttp://dotnetside.org
o Il mio bloghttp://www.vifani.com
Q & A
Domande ?
Grazie per l’attenzione