dependency injection

Post on 15-Nov-2014

1.019 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

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

top related