dependency injection

31
Dependency Injection Raffaele Fanizzi www.skyraysolutions.com Vicepresidente e Technical Architect, Skyray Solutions SRL MCPD & MCTS

Upload: raffaele-fanizzi

Post on 15-Nov-2014

1.019 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Dependency Injection

Dependency Injection

Raffaele Fanizziwww.skyraysolutions.comVicepresidente e Technical Architect, Skyray Solutions SRLMCPD & MCTS

Page 2: Dependency Injection

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

Page 3: Dependency Injection

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

Page 4: Dependency Injection

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

Page 5: Dependency Injection

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

Page 6: Dependency Injection

Dependency Injection

o High Coupling => Low Coupling

Page 7: Dependency Injection

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

Page 8: Dependency Injection

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

Page 9: Dependency Injection

Dependency Injection

o Come possono essere iniettate le dipendenze?

o Constructor Injection

o Property o Setter Injection

o Method Call Injection

Page 10: Dependency Injection

Dependency Injection

o Constructor Injectiono Le componenti vengono iniettate dall’IoC Container

attraverso il costruttore

Page 11: Dependency Injection

Dependency Injection

o Property o Setter Injection

o Le componenti vengono iniettate dall’IoC Container richiamando il setter di alcune proprietà

Page 12: Dependency Injection

Dependency Injection

o Method Call Injection

o Le componenti vengono iniettate dall’IoC Container richiamando un metodo

Page 13: Dependency Injection

Dependency Injection

o Al crescere della complessità di un software, del numero di classi e del disaccoppiamento, la risoluzione delle dipendenze diventa un problema

Page 14: Dependency Injection

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

Page 15: Dependency Injection

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

Page 16: Dependency Injection

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

Page 17: Dependency Injection

Configurazione di Unity

o Possibili scenari di mapping tra le interfacce e le classi

Mapping 1-N

L’interfaccia va mappata su più classi

Page 18: Dependency Injection

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

Page 19: 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

Page 20: Dependency Injection

Uso di Unity

o Constructor Injection (default)

Page 21: Dependency Injection

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

Page 22: Dependency Injection

Uso di Unity

o Property o Setter Injection

Page 23: Dependency 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”)]

Page 24: Dependency Injection

Uso di Unity

o Method Injection

Page 25: Dependency 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

Page 26: Dependency 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

Page 27: Dependency Injection

Un esempio praticoo Applied Pattern V1 – Spaghetti Code

o Applied Pattern V2 – Components

o Applied Pattern V3 – MVVM

o Applied Pattern V4 – Dependency Injection

Page 28: Dependency Injection

Altre potenzialità

o Lifetime Management

o Pattern Singleton

o Aspect Oriented Programming

o Volete vederne un esempio ?

Page 29: Dependency Injection

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

Page 30: Dependency Injection

Q & A

Domande ?

Page 31: Dependency Injection

Grazie per l’attenzione