Este documento discute o padrão de injeção de dependência e como ele pode ser implementado usando o Unity Application Block. O documento começa explicando os problemas de alto acoplamento entre classes e como a injeção de dependência ajuda a resolver esses problemas. Em seguida, apresenta o Unity Application Block, discutindo suas funcionalidades como mapeamento de dependências e resolução de instâncias. Por fim, há uma demonstração prática do uso do Unity.
Community Launch 2010 - Visual Studio 2010 (por Leandro Daniel)
Injeção de Dependência com Unity
1. Injeção de Dependência Leandro Daniel MCAD, MCSD, CSM Utilizando injeção de dependência com o Unity
2. Agenda Contexto de utilização O padrão de injeção de dependência Apresentando o Unity Application Block Entendendo métricas de acoplamento Demonstração Dúvidas
11. Resumindo Classes com alto acoplamento dificultam a manutenção e testabilidade (podem dificultar o desenvolvimento) Alterações em classes com acoplamento aferente impactam as classes dependentes (e vice-versa) Dependências complexas são difíceis de gerenciar Deixar a aplicação plugável e flexível em geral requer prática (ou um framework)
13. Algumas técnicas disponíveis Abstract Factory Pattern Builder Pattern Service Locator Pattern IoC - Inversion of Control Pattern DI - Dependency Injection Pattern Programe para uma interface e não para uma implementação
16. Uma técnica para desacoplamento de classes (um caso particular de IoC) Baseado em um builder responsável pela construção de outros objetos Comumente, apresenta-se sob as três formas: Interface Injection Setterinjection Constructorinjection Utiliza um container para armazenamento de objetos O que é?
18. Origem Martin Fowler, popularizou o termo Injeção de Dependência como uma forma de Inversão de Controle
19. “Padronizar um conjunto de notações consistentes e não controverso que permita que classes injetáveis possam ser portadas entre os vários frameworks.” Fonte: http://tinyurl.com/diinfoq(InfoQ- notícias, CraigWickesser)
20. Pico Container http://www.picocontainer.org Spring Frameworks (Spring.NET) http://www.springframework.org Guice http://code.google.com/p/google-guice Castle Windsor (MicroKernel) http://www.castleproject.org Alguns frameworks...
21. Meus objetos e classes possuem dependência de outros objetos? Minhas dependências são complexas e requerem abstração? Injetar dependência na construção ou na chamada de objetos traz alguma vantagem? Preciso gerenciar o tempo de vida dos meus objetos? Preciso configurar as dependências dos meus objetos por meio de um arquivo de configuração? Preciso manter um cache das minhas dependências numa aplicação Web? Quando devo utilizar?
22. As dependências forem muito simples Faltam boas práticas básicas As interfaces não podem ser definidas com clareza Não existe ganho na utilização de containers Repense a utilização se... O ideal não existe...
32. Unity Application Block Possibilita construir instâncias de objetos contendo dependência entre eles Expõe um método chamado RegisterType que suporta a configuração do container com o mapeamento dos objetos (interface classe concreta) Expõe o método Resolve que retorna as instâncias dos métodos construídos com todas as suas dependências resolvidas
33. Unity Application Block Provê injeção de dependência para interfaces e construtores de classes por meio de atributos nas propriedades e métodos Hierarquia de containers Configuração em arquivos XML Lifetime Manager
39. Como medir as dependências? Exemplo: Código morto Exemplo: Problemas de design Fonte: http://tinyurl.com/couplingmetrics (CodeBetter - artigo de Patrick Smacchia, MVP C#)
43. IoC Containers and the Dependency Injection pattern(Martin Fowler, 2004)http://www.martinfowler.com/articles/injection.html Enterprise Library Contribhttp://entlibcontrib.codeplex.com/ Exemploscomplementareshttp://reverb.leandrodaniel.com/category/Enterprise-Library.aspx Artigo na revista .net Magazine 62 Referências
44. Designing Reusable Classes (Ralph Johnson & Brian Foote, 1988) http://www.laputan.org/drc/drc.html Inversion of Control(Martin Fowler, 2005)http://martinfowler.com/bliki/InversionOfControl.html javax.inject.Inject(Google Code)http://tinyurl.com/ceaknx Referências