Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Dependency Injection

976 views

Published on

Published in: Technology
  • Be the first to comment

Dependency Injection

  1. 1. DependencyInjection<br />Raffaele Fanizzi<br />www.skyraysolutions.com<br />Vicepresidente e TechnicalArchitect, SkyraySolutions SRL<br />MCPD & MCTS<br />
  2. 2. Agenda<br />DependencyInjection<br />Introduzione a Unity<br />Configurazione di Unity<br />Uso di Unity<br />Un esempio pratico<br />Altre potenzialità<br />Q&A<br />
  3. 3. DependencyInjection<br />Cosa è la DependencyInjection?<br />E’ una tecnica della programmazione orientata agli oggetti<br />A cosa serve?<br />Risolvere le dipendenze tra le componenti<br />Favorire il disaccoppiamento tra le componenti<br />
  4. 4. DependencyInjection<br />High Coupling<br />Dipendenza stretta tra le componenti<br />Scarsa possibilità di modificare e/o sostituire una componente contenendo l’impatto sul resto del sistema<br />Scarsa possibilità di realizzare un’applicazione testabile<br />Facile da implementare: va a braccetto con la programmazione mediante “spaghetti code” <br />Classe<br />PersonProvider<br />Classe<br />MainWindow<br />Classe<br />MessageManager<br />
  5. 5. DependencyInjection<br />High Coupling => Low Coupling<br />Si usano le interfacce per esporre le funzionalità delle componenti<br />Ogni componente implementerà una o più interfacce e richiamerà le altre componenti mediante le loro interfacce<br />Ogni componente non sa nulla di come funzionano le altre, ma ne conosce esclusivamente l’interfaccia<br />
  6. 6. DependencyInjection<br />High Coupling => Low Coupling<br />
  7. 7. DependencyInjection<br />Interfaccia<br />IPersonProvider<br />Referenzia<br />Low Coupling<br />Dipendenza tra le componenti limitata<br />Possibilità di modificare e/o sostituire una componente contenendo l’impatto sul resto del sistema<br />Possibilità di sostituire le implementazioni per realizzare casi di test<br />Non così semplice da implementare: richiede un minimo di progettazione del software <br />Classe<br />PersonViewModel<br />Interfaccia<br />IMessageManager<br />Risolve le referenze<br />Classe<br />PersonProvider<br />Classe<br />MessageManager<br />Crea<br />???<br />
  8. 8. DependencyInjection<br />Il low coupling introduce due problemi: <br />chi e come vengono associate le interfacce alle implementazioni?<br />Un InversionofControl (IoC) Container ha il compito di rilevare le dipendenze di una componente e di “inniettarle”, risolvendo l’associazione tra interfacce ed implementazione<br />Cosa si intende con InversionofControl? Quale è la logica di controllo che viene invertita?<br />La risposta è: la logica di creazione delle istanze<br />
  9. 9. DependencyInjection<br />Come possono essere iniettate le dipendenze?<br />ConstructorInjection<br />Property o Setter Injection<br />MethodCallInjection<br />
  10. 10. DependencyInjection<br />ConstructorInjection<br />Le componenti vengono iniettate dall’IoC Container attraverso il costruttore<br />
  11. 11. DependencyInjection<br />Property o Setter Injection<br />Le componenti vengono iniettate dall’IoC Container richiamando il setter di alcune proprietà<br />
  12. 12. DependencyInjection<br />MethodCallInjection<br />Le componenti vengono iniettate dall’IoC Container richiamando un metodo<br />
  13. 13. DependencyInjection<br />Al crescere della complessità di un software, del numero di classi e del disaccoppiamento, la risoluzione delle dipendenze diventa un problema<br />
  14. 14. Introduzione a Unity<br />E’ una libreria sviluppata da Microsoft che si occupa di implementare le seguenti funzionalità:<br />DependencyInjection<br />Interception<br />L’attuale versione 2.0 è stata integrata nell’EnterpriseLibrary 5.0<br />Può essere adottata in qualsiasi progetto .NET 3.5/4.0 o Silverlight<br />E’ open source rilasciata sotto licenza Microsoft Public License<br />
  15. 15. Configurazione di Unity<br />Unity può essere configurato in due modi:<br />Programmaticamente<br />File di configurazione (.config)<br />Qual è l’aspetto più importante da configurare per un IoC Container?<br />Mapping tra le interfacce e le classi che le implementano<br />
  16. 16. Configurazione di Unity<br />Possibili scenari di mapping tra le interfacce e le classi<br />
  17. 17. Configurazione di Unity<br />Possibili scenari di mapping tra le interfacce e le classi<br />
  18. 18. Uso di Unity<br />Per usare Unity è sufficiente creare un’istanza della classe UnityContainer ed utilizzarla per risolvere gli oggetti di cui abbiamo bisogno mediante il metodo Resolve<br />Il metodo Resolve accetta in input qualsiasi tipo<br />Se il tipo è un’interfaccia, utilizza la configurazione per tentare di risolverla e, se necessario, ne esegue la DependencyInjection<br />Se il tipo è una classe se è necessario, ne esegue la DependencyInjection<br />
  19. 19. Uso di Unity<br />ConstructorInjection (default)<br />
  20. 20. Uso di Unity<br />ConstructorInjection (default)<br />
  21. 21. Uso di Unity<br />Property o Setter Injection<br />
  22. 22. Uso di Unity<br />Property o Setter Injection<br />
  23. 23. Uso di Unity<br />MethodInjection<br />
  24. 24. Uso di Unity<br />MethodInjection<br />
  25. 25. Uso di Unity<br />Constructor vs PropertyInjection vs MethodInjection, chi vince?<br />Secondo me la ConstructorInjectionperché…<br />La ConstructorInjection è l’unico tipo di injection che, potenzialmente, non richiede la decorazione con attributi custom di Unity<br />Vi permette di astrarvi dallo specifico IoC Container<br />La PropertyInjection e la MethodInjection richiedono l’uso obbligatorio dell’attributo di Unity e obbligano l’esposizione di una proprietà o di un metodo pubblico per consentire l’Injection<br />
  26. 26. Uso di Unity<br />Altre funzionalità utili<br />Metodo RegisterInstance<br />Consente di registrare un’istanza di una classe già esistente nel container<br />Metodo BuildUp<br />Consente di eseguire la DependencyInjection (solo Setter e MethodInjection) di un’istanza creata esternamente all’IoC Container<br />Metodo ResolveAll<br />Consente di risolvere tutte le classi registrate per una determinata interfaccia<br />
  27. 27. Un esempio pratico<br />Applied Pattern V1 – Spaghetti Code<br />Applied Pattern V2 – Components<br />Applied Pattern V3 – MVVM<br />Applied Pattern V4 – DependencyInjection<br />
  28. 28. Altre potenzialità<br />Lifetime Management<br />Pattern Singleton<br />AspectOrientedProgramming<br />Volete vederne un esempio ? <br />
  29. 29. Risorse<br />MSDNhttp://msdn.microsoft.com<br />DependencyInjection e IoC Containerhttp://martinfowler.com/articles/injection.html<br />Unityhttp://unity.codeplex.com/<br />DotNetSidehttp://dotnetside.org<br />Il mio bloghttp://www.vifani.com<br />
  30. 30. Q & A<br />Domande ?<br />
  31. 31. Grazie per l’attenzione <br />

×