![Page 1: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/1.jpg)
Inversão de Controlo (IoC) / Injecção de Dependência (DI)
Bruno Lopes e Caio Proiete
http://netponto.org14ª Reunião Presencial - 18/09/2010
![Page 2: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/2.jpg)
Bruno Lopes
• 5 anos de experiência profissional em IT
• Co-Fundador da weListen, Business Solutions
• Ex-Sysadmin• Pythonista nos tempos
livres
![Page 3: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/3.jpg)
Bruno Lopes
• 10 anos de experiência profissional em TI
• Consultor da Novabase• Formador da Ciclo• Microsoft MVP, MCT
• 5 anos de experiência profissional em IT
• Co-Fundador da weListen, Business Solutions
• Ex-Sysadmin• Pythonista nos tempos
livres
Caio Proiete
![Page 4: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/4.jpg)
Agenda
• Inversão de Controlo (IoC) - Princípio• Dependency Injection (DI) - Padrão–Demo
• Unity e Autofac como containers para DI–Demo
• Outros containers para DI
![Page 5: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/5.jpg)
Também disponível em vídeo...
Assista!http://www.vimeo.com/20080387
![Page 6: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/6.jpg)
![Page 7: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/7.jpg)
// Magic. Do not touch.
http://stackoverflow.com/questions/184618
![Page 8: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/8.jpg)
// Magic. Do not touch.
// When I wrote this, only God and I understood what I was doing
http://stackoverflow.com/questions/184618
![Page 9: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/9.jpg)
// Magic. Do not touch.
// When I wrote this, only God and I understood what I was doing// Now, God only knows
http://stackoverflow.com/questions/184618
![Page 10: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/10.jpg)
// Magic. Do not touch.
// When I wrote this, only God and I understood what I was doing// Now, God only knows
// somedev1 - 06/07/02 Adding temporary tracking of Login screen// somedev2 - 05/22/07 Temporary my ass
http://stackoverflow.com/questions/184618
![Page 11: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/11.jpg)
Inversão de Controlo (IoC)Numa hierarquia, os módulos de nível mais alto não devem depender directamente dos módulos de nível mais baixo. Ambos devem depender de abstracções.
![Page 12: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/12.jpg)
Inversão de Controlo (IoC)Numa hierarquia, os módulos de nível mais alto não devem depender directamente dos módulos de nível mais baixo. Ambos devem depender de abstracções.
As abstracções não devem depender de detalhes de implementação, mas os detalhes devem depender das abstracções.
![Page 13: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/13.jpg)
public class SessoesNetPontoService{ public IEnumerable<Sessao> ObterSessoesDo(string nomeOrador) { var service = new NetPontoDataService();
return service.ObterSessoes() .Where(s => s.Orador.Nome == nomeOrador) }}
Exemplo (simples) da Violação do Princípio
Inversão de Controlo (IoC)
![Page 14: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/14.jpg)
public class SessoesNetPontoService{ public IEnumerable<Sessao> ObterSessoesDo(string nomeOrador) { var service = new NetPontoDataService();
return service.ObterSessoes() .Where(s => s.Orador.Nome == nomeOrador) }}
Exemplo (simples) da Violação do Princípio
Inversão de Controlo (IoC)
![Page 15: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/15.jpg)
public class SessoesNetPontoService{ public IEnumerable<Sessao> ObterSessoesDo(string nomeOrador) { var service = new NetPontoDataService();
return service.ObterSessoes() .Where(s => s.Orador.Nome == nomeOrador) }}
Exemplo (simples) da Violação do PrincípioPrecisamos abstrair esta
dependência.Dependency Injection FTW :)
Inversão de Controlo (IoC)
![Page 16: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/16.jpg)
Injecção de Dependências (DI)
• Técnica / Padrão de Implementação• Diferentes Formas de Implementar–Constructor Injection*– Setter Injection– Interface Injection* mais comum
![Page 17: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/17.jpg)
IoC – Antes e depois
demonstração
![Page 18: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/18.jpg)
IoC Containers• Bibliotecas de suporte a DI• Implementam– Registo de implementações de serviços– Resolução de dependências– Gestão de ciclo de vida– Ocasionalmente AOP/Interception
• Demonstração de duas alternativas:– Unity– Autofac
![Page 19: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/19.jpg)
Unity: DI Container• “Application Block” da Microsoft– http://unity.codeplex.com
• Actualmente na versão 2.0.• Variantes para – .NET 3.5 e 4.0– Silverlight 3 e 4
• Parte integrante da Enterprise Library – http://entlib.codeplex.com
![Page 20: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/20.jpg)
Autofac: DI Container• Open-Source– http://code.google.com/p/autofac/
• Actualmente na versão 2.2.4– Versão 2.3.1 em Preview
• Variantes para – .NET 3.5 e 4.0– Silverlight 3 e 4
![Page 21: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/21.jpg)
Utilização de ContainersUnity e Autofac
demonstração
![Page 22: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/22.jpg)
Outros containers para DI• Castle Windsor
– http://www.castleproject.org/container/index.html• Ninject
– http://ninject.org• Spring.NET
– http://www.springframework.net• StructureMap
– http://structuremap.sourceforge.net
• Lista com mais algumas opções– http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx
![Page 23: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/23.jpg)
Resumo• Dependency Injection– Classes independentes umas das outras através de
abstrações.– Menor impacto para introdução de mudanças e código
mais fácil de testar.– Diferentes formas de implementar (Constructor, Setter,
Interface, entre outras...– Normalmente utiliza-se algum tipo de Container para
as dependências. Várias opções disponíveis.
![Page 24: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/24.jpg)
Questões?
![Page 25: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/25.jpg)
Patrocinadores deste evento
![Page 26: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/26.jpg)
Próximas reuniões presenciais
• 18/09/2010 - Setembro• 23/10/2010 - Outubro• 20/11/2010 - Novembro• 11/12/2010 - Dezembro
Reserva estes dias na agenda! :)
![Page 27: Inversão de Controlo (IoC) / Injecção de Dependência (DI)](https://reader030.vdocuments.mx/reader030/viewer/2022020115/546cf810b4af9f702c8b5241/html5/thumbnails/27.jpg)
Obrigado!Bruno [email protected]://brunomlopes.comhttp://twitter.com/brunomlopes
Caio [email protected]://caioproiete.comhttp://twitter.com/caioproiete