Inversão de Controlo (IoC) / Injecção de Dependência (DI)

27
Inversão de Controlo (IoC) / Injecção de Dependência (DI) Bruno Lopes e Caio Proiete http://netpont o.org 14ª Reunião Presencial - 18/09/2010

description

Apresentação sobre Inversão de Controlo (IoC) / Injecção de Dependência (DI) por Bruno Lopes e Caio Proiete (MVP), no evento de aniversário da comunidade NetPonto

Transcript of Inversão de Controlo (IoC) / Injecção de Dependência (DI)

Page 1: Inversão de Controlo (IoC) / Injecção de Dependência (DI)

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)

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)

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)

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)

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)
Page 7: Inversão de Controlo (IoC) / Injecção de Dependência (DI)

// Magic. Do not touch.

http://stackoverflow.com/questions/184618

Page 8: Inversão de Controlo (IoC) / Injecção de Dependência (DI)

// 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)

// 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)

// 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)

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)

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)

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)

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)

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)

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)

IoC – Antes e depois

demonstração

Page 18: Inversão de Controlo (IoC) / Injecção de Dependência (DI)

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)

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)

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)

Utilização de ContainersUnity e Autofac

demonstração

Page 22: Inversão de Controlo (IoC) / Injecção de Dependência (DI)

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)

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)

Questões?

Page 26: Inversão de Controlo (IoC) / Injecção de Dependência (DI)

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! :)