DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

1,662 views
1,604 views

Published on

Palestra de Leandro Daniel no .Net Architects Day 2009 sobre injeção de dependência com o Unity.

Published in: Technology, Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,662
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
24
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

  1. 1. Injeção de Dependência<br />Leandro Daniel<br />MCAD, MCSD, CSM<br />Utilizando injeção de dependência com o Unity<br />
  2. 2. Agenda<br />Contexto de utilização<br />O padrão de injeção de dependência<br />Apresentando o Unity Application Block<br />Entendendo métricas de acoplamento<br />Demonstração<br />Dúvidas<br />
  3. 3. Contexto de utilização<br />
  4. 4. Era uma vez...<br />
  5. 5. No início...<br />!<br />Dev1<br />Dev2<br />Dev3<br />
  6. 6. Contornando...<br />Dev2<br />Dev1<br />?<br />Dev3<br />MethodStub<br />ConsoleLogger<br />Tester<br />
  7. 7. Classe pronta...<br />!<br />Dev2<br />Dev1<br />Dev3<br />MethodStub<br />ConsoleLogger<br />
  8. 8. Mudanças acontecem...<br />!!<br />Dev2<br />Dev1<br />??<br />Dev3<br />Tester<br />
  9. 9. Mudanças acontecem, sempre...<br />Dev2<br />!!!<br />...<br />Dev1<br />Dev3<br />???<br />@#$!<br />Tester<br />
  10. 10. Um provável cenário...<br />Dev2<br />Dev1<br />Dev3<br />Alto acoplamento!<br />
  11. 11. Resumindo<br />Classes com alto acoplamento dificultam a manutenção e testabilidade (podem dificultar o desenvolvimento)<br />Alterações em classes com acoplamento aferente impactam as classes dependentes (e vice-versa)<br />Dependências complexas são difíceis de gerenciar<br />Deixar a aplicação plugável e flexível em geral requer prática (ou um framework)<br />
  12. 12. Lembre-se<br />coesão ≠ acoplamento<br />
  13. 13. Algumas técnicas disponíveis<br />Abstract Factory Pattern<br />Builder Pattern<br />Service Locator Pattern<br />IoC - Inversion of Control Pattern<br /> DI - Dependency Injection Pattern<br />Programe para uma interface<br />e não para uma implementação<br />
  14. 14. O padrão de Injeção de Dependência<br />
  15. 15. Design Patternspodem ajudar...<br />
  16. 16. Uma técnica para desacoplamento de classes (um caso particular de IoC)<br />Baseado em um builder responsável pela construção de outros objetos<br />Comumente, apresenta-se sob as três formas:<br />Interface Injection <br />Setterinjection<br />Constructorinjection<br />Utiliza um container para armazenamento de objetos<br />O que é?<br />
  17. 17. SL e DI (IoC)<br />
  18. 18. Origem<br />Martin Fowler, popularizou o termo Injeção de Dependência como uma forma de Inversão de Controle<br />
  19. 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.”<br />Fonte: <br />http://tinyurl.com/diinfoq(InfoQ- notícias, CraigWickesser)<br />
  20. 20. Pico Container http://www.picocontainer.org<br />Spring Frameworks (Spring.NET) http://www.springframework.org<br />Guice<br />http://code.google.com/p/google-guice<br />Castle Windsor (MicroKernel)<br /> http://www.castleproject.org <br />Alguns frameworks...<br />
  21. 21. Meus objetos e classes possuem dependência de outros objetos?<br />Minhas dependências são complexas e requerem abstração?<br />Injetar dependência na construção ou na chamada de objetos traz alguma vantagem? <br />Preciso gerenciar o tempo de vida dos meus objetos? <br />Preciso configurar as dependências dos meus objetos por meio de um arquivo de configuração? <br />Preciso manter um cache das minhas dependências numa aplicação Web? <br />Quando devo utilizar?<br />
  22. 22. As dependências forem muito simples<br />Faltam boas práticas básicas<br />As interfaces não podem ser definidas com clareza<br />Não existe ganho na utilização de containers<br />Repense a utilização se...<br />O ideal não existe...<br />
  23. 23. E o arquiteto?<br />
  24. 24. Tomando decisões<br />‘<br />A aplicação de DI pode representar um risco levando em consideração o skill da equipe? <br />A empresa tem como cultura a prática de testes (TDD ou qualquer outra técnica)? <br />Se a aplicação não tem previsão de vida longa vale a pena aplicar DI? <br /><ul><li>Eu consigo aumentar o skill da minha equipe aplicando nova técnica?
  25. 25. Eu consigo mostrar os benefícios de praticarmos TDD já que DI nos propicia isso mais facilmente?
  26. 26. Eu consigo comprovar que os custos com manutenção serão menores se empregarmos melhores técnicas agora, ainda que isso onere um pouco mais o projeto? </li></li></ul><li>Unity Application Block<br />
  27. 27. Cross-cuttingconcernse algo mais...<br />
  28. 28. Unity Application Block<br />Fev/2008<br /><ul><li>Lançado o CTP do Unity
  29. 29. http://www.codeplex.com/unity</li></ul>Abr/2008<br /><ul><li>Lançada a versão 1.0</li></ul>Mai/2008<br /><ul><li>Unity é incorporado a Enterprise Library 4.0
  30. 30. Continua com a opção de instalação separada</li></ul>Out/2008<br /><ul><li>Atualizada juntamente com a Enterprise Library 4.1
  31. 31. Versão separada atualizada para 1.2</li></ul> Dez/2008<br /><ul><li>Port do Unity para Silverlight</li></ul>Chris Tavares<br />
  32. 32. Unity Application Block<br />Possibilita construir instâncias de objetos contendo dependência entre eles<br />Expõe um método chamado RegisterType que suporta a configuração do container com o mapeamento dos objetos (interface  classe concreta)<br />Expõe o método Resolve que retorna as instâncias dos métodos construídos com todas as suas dependências resolvidas<br />
  33. 33. Unity Application Block<br />Provê injeção de dependência para interfaces e construtores de classes por meio de atributos nas propriedades e métodos<br />Hierarquia de containers<br />Configuração em arquivos XML <br />Lifetime Manager<br />
  34. 34. Constructor Injection<br />
  35. 35. Setter Injection<br />
  36. 36. Unity Application Block<br />Simples<br />Extensível<br />Código-fonte disponível<br />AOP<br />
  37. 37. Unity Application Block<br />Cuidado com a<br />referência circular!<br />
  38. 38. Métricas de acoplamento<br />
  39. 39. Como medir as dependências?<br />Exemplo:<br />Código<br />morto<br />Exemplo:<br />Problemas<br />de design<br />Fonte: <br />http://tinyurl.com/couplingmetrics (CodeBetter - artigo de Patrick Smacchia, MVP C#)<br />
  40. 40. Quanta dependência mesmo?<br />
  41. 41. Demonstração<br />
  42. 42. Unity Application Blockhttp://www.codeplex.com/unity<br />Enterprise Library <br />http://www.codeplex.com/entlib<br />NDependhttp://www.ndepend.com/<br />Downloads<br />
  43. 43. IoC Containers and the Dependency Injection pattern(Martin Fowler, 2004)http://www.martinfowler.com/articles/injection.html<br />Enterprise Library Contribhttp://entlibcontrib.codeplex.com/<br />Exemploscomplementareshttp://reverb.leandrodaniel.com/category/Enterprise-Library.aspx<br />Artigo na revista .net Magazine 62<br />Referências<br />
  44. 44. Designing Reusable Classes (Ralph Johnson & Brian Foote, 1988)<br />http://www.laputan.org/drc/drc.html<br />Inversion of Control(Martin Fowler, 2005)http://martinfowler.com/bliki/InversionOfControl.html<br />javax.inject.Inject(Google Code)http://tinyurl.com/ceaknx<br />Referências<br />
  45. 45. Dúvidas<br />
  46. 46. Obrigado!Até o DNAD 2010!<br />Leandro Daniel<br />contato@leandrodaniel.com<br />http://reverb.leandrodaniel.com<br />Twitter: @leandronet<br />

×