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

Post on 18-Nov-2014

2.565 views 3 download

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)

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

Bruno Lopes

• 5 anos de experiência profissional em IT

• Co-Fundador da weListen, Business Solutions

• Ex-Sysadmin• Pythonista nos tempos

livres

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

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

Também disponível em vídeo...

Assista!http://www.vimeo.com/20080387

// Magic. Do not touch.

http://stackoverflow.com/questions/184618

// Magic. Do not touch.

// When I wrote this, only God and I understood what I was doing

http://stackoverflow.com/questions/184618

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

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

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.

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.

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)

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)

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)

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

IoC – Antes e depois

demonstração

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

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

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

Utilização de ContainersUnity e Autofac

demonstração

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

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.

Questões?

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

Obrigado!Bruno Lopesbrunomlopes@netponto.orghttp://brunomlopes.comhttp://twitter.com/brunomlopes

Caio Proietecaio@netponto.orghttp://caioproiete.comhttp://twitter.com/caioproiete