SlideShare a Scribd company logo
1 of 41
Inversion of Control e  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 !!! SomeServiceFactory Method quando il codice è scritto bene in Test Driven,  le responsabilità sono ben isolate e ...
Depenedency Injection Rocks !!! SomeServiceFactory Method ... le dipendenze e le relative configurazioni si moltiplicano ...
Frameworks di IoC  o Inversion of control containers Possono essere di aiuto gli IoC Containers,  tra i più famosi ...
Frameworks di IoC  ci sono 3 tipi principali di DI *: ,[object Object]
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 OpenRastae 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 complessi per implementarlo ... meglio ... si possono ottenere gli stessi risultati  con minore sforzo (meno codice)

More Related Content

Similar to Inversion of control e Dependency Injection (ITA)

How I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven DesignHow I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven DesignAndrea Saltarello
 
Dependency injection: the good parts
Dependency injection:  the good partsDependency injection:  the good parts
Dependency injection: the good partsMassimo Groppelli
 
Integrazione continua con TFS Build
Integrazione continua con TFS BuildIntegrazione continua con TFS Build
Integrazione continua con TFS BuildGian Maria Ricci
 
Wpc2019 - Distruggere DevOps, la storia di un vero team
Wpc2019 - Distruggere DevOps, la storia di un vero teamWpc2019 - Distruggere DevOps, la storia di un vero team
Wpc2019 - Distruggere DevOps, la storia di un vero teamAlessandro Alpi
 
Introduzione pratica a docker, da chi lo ha appena conosciuto
Introduzione pratica a docker, da chi lo ha appena conosciutoIntroduzione pratica a docker, da chi lo ha appena conosciuto
Introduzione pratica a docker, da chi lo ha appena conosciutoDaniele Megna
 
AntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatoreAntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatoreManuel Scapolan
 
Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)DotNetMarche
 
Rich client application: MVC4 + MVVM = Knockout.js
Rich client application: MVC4 + MVVM = Knockout.jsRich client application: MVC4 + MVVM = Knockout.js
Rich client application: MVC4 + MVVM = Knockout.jsGiorgio Di Nardo
 
Fe04 angular js-101
Fe04   angular js-101Fe04   angular js-101
Fe04 angular js-101DotNetCampus
 
Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e...
Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e...Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e...
Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e...Marco Parenzan
 
Scala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéScala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéEdmondo Porcu
 
Design Pattern Architetturali - Dependency Injection
Design Pattern Architetturali - Dependency InjectionDesign Pattern Architetturali - Dependency Injection
Design Pattern Architetturali - Dependency InjectionRiccardo Cardin
 
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con DelphiDelphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con DelphiMarco Breveglieri
 
Inversion of Control @ CD2008
Inversion of Control @ CD2008Inversion of Control @ CD2008
Inversion of Control @ CD2008Mauro Servienti
 
Agileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastrutturaAgileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastrutturaXPeppers
 

Similar to Inversion of control e Dependency Injection (ITA) (20)

How I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven DesignHow I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven Design
 
Dependency injection: the good parts
Dependency injection:  the good partsDependency injection:  the good parts
Dependency injection: the good parts
 
Integrazione continua con TFS Build
Integrazione continua con TFS BuildIntegrazione continua con TFS Build
Integrazione continua con TFS Build
 
Total Testing in DevOps
Total Testing in DevOpsTotal Testing in DevOps
Total Testing in DevOps
 
Wpc2019 - Distruggere DevOps, la storia di un vero team
Wpc2019 - Distruggere DevOps, la storia di un vero teamWpc2019 - Distruggere DevOps, la storia di un vero team
Wpc2019 - Distruggere DevOps, la storia di un vero team
 
Introduzione pratica a docker, da chi lo ha appena conosciuto
Introduzione pratica a docker, da chi lo ha appena conosciutoIntroduzione pratica a docker, da chi lo ha appena conosciuto
Introduzione pratica a docker, da chi lo ha appena conosciuto
 
AntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatoreAntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatore
 
Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)
 
Rich client application: MVC4 + MVVM = Knockout.js
Rich client application: MVC4 + MVVM = Knockout.jsRich client application: MVC4 + MVVM = Knockout.js
Rich client application: MVC4 + MVVM = Knockout.js
 
Java introduzione
Java introduzioneJava introduzione
Java introduzione
 
Introduzione a Docker
Introduzione a DockerIntroduzione a Docker
Introduzione a Docker
 
Fe04 angular js-101
Fe04   angular js-101Fe04   angular js-101
Fe04 angular js-101
 
Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e...
Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e...Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e...
Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e...
 
Spring - Ecosistema
Spring - EcosistemaSpring - Ecosistema
Spring - Ecosistema
 
Scala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéScala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perché
 
VS Package @ CD2008
VS Package @ CD2008VS Package @ CD2008
VS Package @ CD2008
 
Design Pattern Architetturali - Dependency Injection
Design Pattern Architetturali - Dependency InjectionDesign Pattern Architetturali - Dependency Injection
Design Pattern Architetturali - Dependency Injection
 
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con DelphiDelphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
 
Inversion of Control @ CD2008
Inversion of Control @ CD2008Inversion of Control @ CD2008
Inversion of Control @ CD2008
 
Agileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastrutturaAgileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastruttura
 

Inversion of control e Dependency Injection (ITA)

  • 1. Inversion of Control e Dependency Injection
  • 2. 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
  • 3. che cosa si intende per IoC ?
  • 4. questa classe ha un problema
  • 5. questa classe ha un problema Questa classe ha un problema * * http://www.objectmentor.com/resources/articles/dip.pdf
  • 6. questa classe ha un problema La classe MyBusinessLogic è dipendente dall'implementazione concreta di FileLogger
  • 7. questa classe ha un problema Nel caso volessi riutilizzare la classe MyBusinessLogic, devo "copiare" nel nuovo progetto anche l'implementazione di FileLogger
  • 8. 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
  • 11. proviamo a sistemarla ora la dipendenza esterna è stata astratta con un'interfaccia
  • 12. proviamo a sistemarla ora il logger concreto deve essere passato (injected) come parametro del costruttore
  • 13. proviamo a sistemarla cosi' facendo la dipendenza è stata invertita
  • 14. proviamo a sistemarla ora la classe MyBusinessLogic dipende da qualcun'altro che dall'esterno deve passare la dipendenza.
  • 15. 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
  • 16. Test Driven Development (TDD) La dependency injection è il modo più pulito per rendere il codice testabile
  • 17. Test Driven Development (TDD) La dependency injection è il modo migliore per disaccoppiare il codice
  • 18. Test Driven Development (TDD) ne consegue che ...
  • 19. Test Driven Development (TDD) TDD ==> codice disaccoppiato gratis !!!
  • 20. Test Driven Development (TDD) Provare per credere ! :-)
  • 24. Depenedency Injection Rocks !!! ma a volte ...
  • 25. Depenedency Injection Rocks !!! ndr: ATTENZIONE !!! questo codice è lineare e leggibile
  • 26. Depenedency Injection Rocks !!! SomeServiceFactory Method quando il codice è scritto bene in Test Driven, le responsabilità sono ben isolate e ...
  • 27. Depenedency Injection Rocks !!! SomeServiceFactory Method ... le dipendenze e le relative configurazioni si moltiplicano ...
  • 28. Frameworks di IoC o Inversion of control containers Possono essere di aiuto gli IoC Containers, tra i più famosi ...
  • 29.
  • 31. Interface injection* Martin Fowler http://martinfowler.com/articles/injection.html (Jan 2004)
  • 32. Frameworks di IoC noi utilizziamo sempre "Constructor Injection"
  • 33. 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
  • 34. Frameworks di IoC esempio con Castle
  • 35. Frameworks di IoC Quando usare la configurazione su file e quando via codice ?
  • 36. 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."
  • 37. Frameworks di IoC Esempio… con OpenRastae DI
  • 39. -- 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
  • 40. -- Parte 2 -- vediamo cosa ne pensa David Heinemeier Hansson dei framework di IoC ... * http://www.scribemedia.org/2006/07/09/dhh/
  • 41. -- Parte 2 -- Il concetto di DI è importantissimo, ma nei linguaggi dinamici non servono framework complessi per implementarlo ... meglio ... si possono ottenere gli stessi risultati con minore sforzo (meno codice)
  • 42. -- Parte 2 -- ref. “Beyond Java” by Bruce Tate pag. 113 Dependency Injection
  • 43. -- 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