Inversion of control e Dependency Injection (ITA)
-
Upload
giancarlo-valente -
Category
Documents
-
view
1.661 -
download
0
description
Transcript of Inversion of control e Dependency Injection (ITA)
Inversion of Controle
Dependency Injection
solo una questione di termini ...
Dependency Injection (DI)è una forma di
Inversion of Control (IoC)
"se puoi chiamarlo con il nome giusto, allora puoi farlo correttamente", anonimo
che cosa si intende per IoC ?
questa classe ha un problema
questa classe ha un problema
Questa classe ha un problema *
* http://www.objectmentor.com/resources/articles/dip.pdf
questa classe ha un problema
La classe MyBusinessLogic è dipendente dall'implementazione concreta di FileLogger
questa classe ha un problema
Nel caso volessi riutilizzare la classe MyBusinessLogic, devo "copiare" nel nuovo progetto anche
l'implementazione di FileLogger
questa classe ha un problema
Nel caso volessi cambiare logger, devo modificare la classe MyBusinessLogic violando il principio di Single
Responsability** http://www.objectmentor.com/resources/articles/srp.pdf
proviamo a sistemarla
proviamo a sistemarla
proviamo a sistemarla
ora la dipendenza esterna è stata astratta con un'interfaccia
proviamo a sistemarla
ora il logger concreto deve essere passato (injected) come parametro del costruttore
proviamo a sistemarla
cosi' facendo la dipendenza è stata invertita
proviamo a sistemarla
ora la classe MyBusinessLogic dipende da qualcun'altro che dall'esterno deve passare la
dipendenza.
ritornando alla terminologia,la Dependency Injection (DI)
è una forma di Inversion of Control (IoC)
noi in genere utilizziamo solo DI, quindi d'ora in poi parleremo
solo di DI
Test Driven Development (TDD)
La dependency injection è il modo più pulito
per rendere il codice testabile
Test Driven Development (TDD)
La dependency injection è il modo migliore
per disaccoppiare il codice
Test Driven Development (TDD)
ne consegue che ...
Test Driven Development (TDD)
TDD ==> codice disaccoppiato gratis !!!
Test Driven Development (TDD)
Provare per credere ! :-)
Test Driven Development (TDD)
Test Driven Development (TDD)
Depenedency Injection Rocks !!!
Depenedency Injection Rocks !!!
ma a volte ...
Depenedency Injection Rocks !!!
ndr: ATTENZIONE !!! questo codice è lineare e leggibile
Depenedency Injection Rocks !!!
quando il codice è scritto bene in Test Driven, le responsabilità sono ben isolate e ...
SomeService Factory Method
Depenedency Injection Rocks !!!
... le dipendenze e le relative configurazionisi moltiplicano ...
SomeService Factory Method
Frameworks di IoC o Inversion of control
containersPossono essere di aiuto gli IoC Containers, tra i più famosi ...
Frameworks di IoC
ci sono 3 tipi principali di DI *:• Constructor injection• Setter injection• Interface injection
* Martin Fowler http://martinfowler.com/articles/injection.html (Jan 2004)
Frameworks di IoC
noi utilizziamo sempre "Constructor Injection"
Frameworks di IoC
noi utilizziamo sempre "Constructor Injection"
"If you use Dependency Injection there are a number of styles to choose between. I would suggest you follow constructor injection unless you run into one of the specific problems with that approach, in which case switch to setter injection. ", Martin Fowler
Frameworks di IoC
esempio con Castle
Frameworks di IoC Quando usare la configurazione su file e quando via codice ?
Frameworks di IoC Quando usare la configurazione su file e quando via codice ?
Fowler consiglia: "For most applications that are likely to be deployed in many places, a separate configuration file usually makes most sense. Almost all the time this will be an XML file, and this makes sense. However there are cases where it's easier to use program code to do the assembly. One case is where you have a simple application that's not got a lot of deployment variation. In this case a bit of code can be clearer than a separate XML file."
Frameworks di IoC
Esempio … con OpenRasta e DI
-- Parte 2 --
-- Parte 2 --
"... il vostro amico Happy Harry Hard Onè qui per ricordarvi
di mangiare i cereali con la forchetta,e di fare i compiti al buio ...", da Pump Up The Volume
-- Parte 2 --
vediamo cosa ne pensa David Heinemeier Hansson
dei framework di IoC ...
* http://www.scribemedia.org/2006/07/09/dhh/
-- Parte 2 --
Il concetto di DI è importantissimo, ma nei linguaggi dinamici non servono framework
complessiper implementarlo
... meglio ...
si possono ottenere gli stessi risultati con minore sforzo (meno codice)
-- Parte 2 --
ref. “Beyond Java” by Bruce Tate
pag. 113 Dependency Injection
-- Parte 2 --Esempio Ruby
class MyBusinessLogic def Execute() Logger.LogEvent("My Event") end end
ora in qualsiasi punto del codice posso sempre, dinamicamente ridefinire la classe Logger
class Logger def LogEvent(msg) .... end end