3. DependencyInjection Cosa è la DependencyInjection? E’ una tecnica della programmazione orientata agli oggetti A cosa serve? Risolvere le dipendenze tra le componenti Favorire il disaccoppiamento tra le componenti
4. DependencyInjection High Coupling Dipendenza stretta tra le componenti Scarsa possibilità di modificare e/o sostituire una componente contenendo l’impatto sul resto del sistema Scarsa possibilità di realizzare un’applicazione testabile Facile da implementare: va a braccetto con la programmazione mediante “spaghetti code” Classe PersonProvider Classe MainWindow Classe MessageManager
5. DependencyInjection High Coupling => Low Coupling Si usano le interfacce per esporre le funzionalità delle componenti Ogni componente implementerà una o più interfacce e richiamerà le altre componenti mediante le loro interfacce Ogni componente non sa nulla di come funzionano le altre, ma ne conosce esclusivamente l’interfaccia
7. DependencyInjection Interfaccia IPersonProvider Referenzia Low Coupling Dipendenza tra le componenti limitata Possibilità di modificare e/o sostituire una componente contenendo l’impatto sul resto del sistema Possibilità di sostituire le implementazioni per realizzare casi di test Non così semplice da implementare: richiede un minimo di progettazione del software Classe PersonViewModel Interfaccia IMessageManager Risolve le referenze Classe PersonProvider Classe MessageManager Crea ???
8. DependencyInjection Il low coupling introduce due problemi: chi e come vengono associate le interfacce alle implementazioni? Un InversionofControl (IoC) Container ha il compito di rilevare le dipendenze di una componente e di “inniettarle”, risolvendo l’associazione tra interfacce ed implementazione Cosa si intende con InversionofControl? Quale è la logica di controllo che viene invertita? La risposta è: la logica di creazione delle istanze
9. DependencyInjection Come possono essere iniettate le dipendenze? ConstructorInjection Property o Setter Injection MethodCallInjection
13. DependencyInjection Al crescere della complessità di un software, del numero di classi e del disaccoppiamento, la risoluzione delle dipendenze diventa un problema
14. Introduzione a Unity E’ una libreria sviluppata da Microsoft che si occupa di implementare le seguenti funzionalità: DependencyInjection Interception L’attuale versione 2.0 è stata integrata nell’EnterpriseLibrary 5.0 Può essere adottata in qualsiasi progetto .NET 3.5/4.0 o Silverlight E’ open source rilasciata sotto licenza Microsoft Public License
15. Configurazione di Unity Unity può essere configurato in due modi: Programmaticamente File di configurazione (.config) Qual è l’aspetto più importante da configurare per un IoC Container? Mapping tra le interfacce e le classi che le implementano
18. Uso di Unity Per usare Unity è sufficiente creare un’istanza della classe UnityContainer ed utilizzarla per risolvere gli oggetti di cui abbiamo bisogno mediante il metodo Resolve Il metodo Resolve accetta in input qualsiasi tipo Se il tipo è un’interfaccia, utilizza la configurazione per tentare di risolverla e, se necessario, ne esegue la DependencyInjection Se il tipo è una classe se è necessario, ne esegue la DependencyInjection
25. Uso di Unity Constructor vs PropertyInjection vs MethodInjection, chi vince? Secondo me la ConstructorInjectionperché… La ConstructorInjection è l’unico tipo di injection che, potenzialmente, non richiede la decorazione con attributi custom di Unity Vi permette di astrarvi dallo specifico IoC Container 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
26. Uso di Unity Altre funzionalità utili Metodo RegisterInstance Consente di registrare un’istanza di una classe già esistente nel container Metodo BuildUp Consente di eseguire la DependencyInjection (solo Setter e MethodInjection) di un’istanza creata esternamente all’IoC Container Metodo ResolveAll Consente di risolvere tutte le classi registrate per una determinata interfaccia