SlideShare uma empresa Scribd logo
1 de 20
DIP, IoC, DI, Service Locator e IoC Containers
                  Um pouco sobre design de código
Agenda
•   DIP - (Dependency Inversion Principle)
•   IoC (Inversion of Control)
•   DI (Dependency Injection)
•   IoC Containers




                                             página 2
Alguns benefícios do que abordaremos
• Baixo acoplamento entre classes
• Essencial para se fazer testes de unidade (testabilidade)
    • Mocks e Stubs
• Favorece um design mais flexível e extensível (extensibilidade)
    • Design plugável (componentização)
• Normalmente promove maior reaproveitamento pois evita-se classes “FazTudo” (maior
  coesão e harmonia nas classes)
• Muitos Design Patterns utilizam estes conceitos




                                                                    página 3
Dependency Inversion Principle
            Um princípio de design OO




                            página 4
DIP – Dependency Inversion Principle
• Bob Martin (Uncle Bob)
• Criador dos princípios SOLID
    • Single responsibility principle
    • Open / closed principle
    • Liskov substitution principle
    • Interface segregation principle
    • Dependency inversion principle
• http://www.objectmentor.com/resources/articles/dip.pdf (C++ em 1996)
• Ajudou a iniciar toda essa paradinha de “Agile”
• Escreveu uns livros legais




                                                                    página 5
DIP – Dependency Inversion Principle
Classes/Modulos de níveis mais altos não devem depender de classes/módulos de níveis
mais baixos. Ambas devem depender de abstrações.



                                 High Level Class




          Interface                  Interface                 Interface

       Low Level Class            Low Level Class           Low Level Class




                                                                       página 6
DIP – Dependency Inversion Principle
Classes/Modulos de níveis mais altos não devem depender de classes/módulos de níveis
mais baixos. Ambas devem depender de abstrações.



           High Level Class
                                          Interface




               Low Level Class         Low Level Class         Low Level Class




                                                                       página 7
Inversion of Control
Formas de como atingir o DIP




                   página 8
Inversion of Control
O que é inversão de controle??

Dita quais as formas que podemos atingir o principio de inversão de dependência.
Um conjunto de “padrões” para atingir o DIP

• Interface inversion
• Flow inversion
• Creation Inversion

Precisamos entender qual “controle” estamos tentando inverter.

http://martinfowler.com/bliki/InversionOfControl.html




                                                                        página 9
Inversion of Control

                        Dependency Inversion (Principle)




                         Inversion of Control (Pattern)




  Interface Inversion           Flow Inversion               Creation Inversion

                                                           Dependency Injection




                                                                      página 10
Interface Inversion
 Não use Interfaces sem saber o porque esta utilizando


     IBanana                                             BancaDeFeira




                        IPera
                                                             ILaranja
                         Pera
                                                             Laranja

                                         IUva
                                          Uva




                                                                        página 11
Interface Inversion
Interfaces devem ter sempre mais de uma implementação ou um planejamento para isso

        IFruta                                         BancaDeFeira


                       Pera
                       Uva
                       Laranja




                                                                      página 12
Flow Inversion
Programa procedural/sequencial (fluxo definido pelo próprio programa)




 Programa com
 GUI, fluxo de
 entrada agora nas
 mãos dos usuários
 (Fluxo invertido)



                                                                        página 13
Creation Inversion
Normalmente criamos nossas classes assim:
         var meuObjeto = new MinhaClasse();
Criação do objeto é feita na classe onde o objeto será utilizado

Mesmo com Interface Inversion você não necessariamente tem Creation Inversion:
          IFruta fruta = new Banana(); //Tipo concreto sendo instanciado na classe que
                                        //esta sendo utilizado
Inverter o Controle aqui significa: Criar o objeto fora da classe onde ele será utilizado

Tipos
• Factory Pattern – Pessoa pessoa = PessoaFactory.Create();
• Service Locator – Pessoa pessoa = ServiceLocator.Create(IPessoa);
• Dependency Injection
    • PessoaRepository pessoaRepository = new PessoaRepository();
       HomeController homeController = new HomeController(pessoaRepository);


                                                                            página 14
Dependency Injection
Uma das maneiras de se inverter o controle




                                 página 15
Dependency Injection
É um tipo de IoC onde movemos a criação/binding da dependência para fora da classe
que necessita de tal dependência.
É forma pela qual associamos os tipos concretos a classes que dependem de abstrações.

Podemos fazer isso de formas diferentes:

                             Cuidado!!!
• Construtor (Constructor Injection) – Mais utilizada
• Propriedade (Setter Injection) – Mais ou menos utilizada
                                      Look Man! I'm injecting my dependencies
• Interface (Interface Injection) – Nem vou perder meu tempo




                                                                       página 16
DEMOnstração
Dependency Injection




           página 17
IoC Containers
 Framework para DI




          página 18
IoC Container
Basicamente um framework que nos ajuda a fazer DI

Existem vários (vários mesmo )
• Ninject - http://ninject.org/ - Segundo o Rodolfo o site mais bacanudo é deles :D
• Unity - http://unity.codeplex.com/ - Da MS
• Castle Windsor - http://stw.castleproject.org/Windsor.MainPage.ashx - Da Castle (bem
   utilizado por sinal)
• Structure Map - http://structuremap.net/structuremap/ - Meu preferido, facinho
• Xxx
• Yyy

Todos nos permitem configurar nosso container apontando qual classe concreta vai para
nossas abstrações.
Alguns permitem configuração via XML (da hora)
Alguns permitem a criação de Interceptors (assunto para outra conversa)


                                                                       página 19
DEMOnstração
IoC Container com Structure Map




                      página 20

Mais conteúdo relacionado

Semelhante a Inversion ofcontrol

Elmish com xamarin.forms
Elmish com xamarin.formsElmish com xamarin.forms
Elmish com xamarin.formsLucas Teles
 
Arquitetura de Microservicos
Arquitetura de MicroservicosArquitetura de Microservicos
Arquitetura de MicroservicosNorberto Enomoto
 
Arquitetura mix thiagoboufleuhr
Arquitetura mix thiagoboufleuhrArquitetura mix thiagoboufleuhr
Arquitetura mix thiagoboufleuhrThiago Boufleuhr
 
TDC2010 - Turbinando sua Aplicação com CDI
TDC2010 - Turbinando sua Aplicação com CDITDC2010 - Turbinando sua Aplicação com CDI
TDC2010 - Turbinando sua Aplicação com CDIRodrigo Cândido da Silva
 
Ruby on Rails como deve ser utilizada e onde - Julio Cartier Maia Gomes
Ruby on Rails como deve ser utilizada e onde - Julio Cartier Maia GomesRuby on Rails como deve ser utilizada e onde - Julio Cartier Maia Gomes
Ruby on Rails como deve ser utilizada e onde - Julio Cartier Maia GomesPotiLivre Sobrenome
 
Treinamento Appium - Introdução
Treinamento Appium - IntroduçãoTreinamento Appium - Introdução
Treinamento Appium - IntroduçãoAndré Salla
 
Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Luís Cobucci
 
CDI -Contextos e Dependências
CDI -Contextos e DependênciasCDI -Contextos e Dependências
CDI -Contextos e DependênciasWende Mendes
 
Inversão de Controle, Injeção de Dependências e AOP com Spring
Inversão de Controle, Injeção de Dependências e AOP com SpringInversão de Controle, Injeção de Dependências e AOP com Spring
Inversão de Controle, Injeção de Dependências e AOP com SpringHenrique Weissmann
 
MVVM Deep Dive - Paulo Aboim Pinto
MVVM Deep Dive - Paulo Aboim PintoMVVM Deep Dive - Paulo Aboim Pinto
MVVM Deep Dive - Paulo Aboim PintoComunidade NetPonto
 
Inversão de Controlo (IoC) / Injecção de Dependência (DI) - Bruno Lopes & C. ...
Inversão de Controlo (IoC) / Injecção de Dependência (DI) - Bruno Lopes & C. ...Inversão de Controlo (IoC) / Injecção de Dependência (DI) - Bruno Lopes & C. ...
Inversão de Controlo (IoC) / Injecção de Dependência (DI) - Bruno Lopes & C. ...Comunidade NetPonto
 

Semelhante a Inversion ofcontrol (20)

Princípios SOLID
Princípios SOLIDPrincípios SOLID
Princípios SOLID
 
Elmish com xamarin.forms
Elmish com xamarin.formsElmish com xamarin.forms
Elmish com xamarin.forms
 
Princípios SOLID
Princípios SOLIDPrincípios SOLID
Princípios SOLID
 
Java - Boas práticas
Java - Boas práticasJava - Boas práticas
Java - Boas práticas
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
Web eclipse
Web eclipseWeb eclipse
Web eclipse
 
Arquitetura do Framework Spring
Arquitetura do Framework SpringArquitetura do Framework Spring
Arquitetura do Framework Spring
 
Arquitetura de Microservicos
Arquitetura de MicroservicosArquitetura de Microservicos
Arquitetura de Microservicos
 
Software robusto e flexível
Software robusto e flexívelSoftware robusto e flexível
Software robusto e flexível
 
Arquitetura mix thiagoboufleuhr
Arquitetura mix thiagoboufleuhrArquitetura mix thiagoboufleuhr
Arquitetura mix thiagoboufleuhr
 
TDC2010 - Turbinando sua Aplicação com CDI
TDC2010 - Turbinando sua Aplicação com CDITDC2010 - Turbinando sua Aplicação com CDI
TDC2010 - Turbinando sua Aplicação com CDI
 
Ruby on Rails como deve ser utilizada e onde - Julio Cartier Maia Gomes
Ruby on Rails como deve ser utilizada e onde - Julio Cartier Maia GomesRuby on Rails como deve ser utilizada e onde - Julio Cartier Maia Gomes
Ruby on Rails como deve ser utilizada e onde - Julio Cartier Maia Gomes
 
Ruby on rails como deve ser utilizada e onde
Ruby on rails como deve ser utilizada e ondeRuby on rails como deve ser utilizada e onde
Ruby on rails como deve ser utilizada e onde
 
Treinamento Appium - Introdução
Treinamento Appium - IntroduçãoTreinamento Appium - Introdução
Treinamento Appium - Introdução
 
Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012
 
CDI -Contextos e Dependências
CDI -Contextos e DependênciasCDI -Contextos e Dependências
CDI -Contextos e Dependências
 
Inversão de Controle, Injeção de Dependências e AOP com Spring
Inversão de Controle, Injeção de Dependências e AOP com SpringInversão de Controle, Injeção de Dependências e AOP com Spring
Inversão de Controle, Injeção de Dependências e AOP com Spring
 
Aula 1a.ppt
Aula 1a.pptAula 1a.ppt
Aula 1a.ppt
 
MVVM Deep Dive - Paulo Aboim Pinto
MVVM Deep Dive - Paulo Aboim PintoMVVM Deep Dive - Paulo Aboim Pinto
MVVM Deep Dive - Paulo Aboim Pinto
 
Inversão de Controlo (IoC) / Injecção de Dependência (DI) - Bruno Lopes & C. ...
Inversão de Controlo (IoC) / Injecção de Dependência (DI) - Bruno Lopes & C. ...Inversão de Controlo (IoC) / Injecção de Dependência (DI) - Bruno Lopes & C. ...
Inversão de Controlo (IoC) / Injecção de Dependência (DI) - Bruno Lopes & C. ...
 

Mais de Cleber Dantas

[Minha Vida TechDay] Novo Dieta e Saúde
[Minha Vida TechDay] Novo Dieta e Saúde[Minha Vida TechDay] Novo Dieta e Saúde
[Minha Vida TechDay] Novo Dieta e SaúdeCleber Dantas
 
Performance em aplicações Web
Performance em aplicações WebPerformance em aplicações Web
Performance em aplicações WebCleber Dantas
 
Dicas de otimização e performance de aplicações Web com ASP.NET
Dicas de otimização e performance de aplicações Web com ASP.NET Dicas de otimização e performance de aplicações Web com ASP.NET
Dicas de otimização e performance de aplicações Web com ASP.NET Cleber Dantas
 
MSTechday - Técnicas e recursos para desenvolvimento web em cenários de grand...
MSTechday - Técnicas e recursos para desenvolvimento web em cenários de grand...MSTechday - Técnicas e recursos para desenvolvimento web em cenários de grand...
MSTechday - Técnicas e recursos para desenvolvimento web em cenários de grand...Cleber Dantas
 
5 dicas simples de performance
5 dicas simples de performance5 dicas simples de performance
5 dicas simples de performanceCleber Dantas
 
[MinhaVida TechDay] NEO4J
[MinhaVida TechDay] NEO4J[MinhaVida TechDay] NEO4J
[MinhaVida TechDay] NEO4JCleber Dantas
 
[MinhaVida TechDay] NoSQL
[MinhaVida TechDay] NoSQL[MinhaVida TechDay] NoSQL
[MinhaVida TechDay] NoSQLCleber Dantas
 
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escala
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escalaTDC - Técnicas e recursos para desenvolvimento web em cenários de grande escala
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escalaCleber Dantas
 
IIS para desenvolvedores
IIS para desenvolvedoresIIS para desenvolvedores
IIS para desenvolvedoresCleber Dantas
 
LABjs e JQuery Templates
LABjs e JQuery TemplatesLABjs e JQuery Templates
LABjs e JQuery TemplatesCleber Dantas
 
Novidades asp.net mvc 4
Novidades asp.net mvc 4Novidades asp.net mvc 4
Novidades asp.net mvc 4Cleber Dantas
 
ASP.NET MVC - O que tem de melhor
ASP.NET MVC - O que tem de melhorASP.NET MVC - O que tem de melhor
ASP.NET MVC - O que tem de melhorCleber Dantas
 
Como trabalhar com ajax, json e cache
Como trabalhar com ajax, json e cacheComo trabalhar com ajax, json e cache
Como trabalhar com ajax, json e cacheCleber Dantas
 

Mais de Cleber Dantas (13)

[Minha Vida TechDay] Novo Dieta e Saúde
[Minha Vida TechDay] Novo Dieta e Saúde[Minha Vida TechDay] Novo Dieta e Saúde
[Minha Vida TechDay] Novo Dieta e Saúde
 
Performance em aplicações Web
Performance em aplicações WebPerformance em aplicações Web
Performance em aplicações Web
 
Dicas de otimização e performance de aplicações Web com ASP.NET
Dicas de otimização e performance de aplicações Web com ASP.NET Dicas de otimização e performance de aplicações Web com ASP.NET
Dicas de otimização e performance de aplicações Web com ASP.NET
 
MSTechday - Técnicas e recursos para desenvolvimento web em cenários de grand...
MSTechday - Técnicas e recursos para desenvolvimento web em cenários de grand...MSTechday - Técnicas e recursos para desenvolvimento web em cenários de grand...
MSTechday - Técnicas e recursos para desenvolvimento web em cenários de grand...
 
5 dicas simples de performance
5 dicas simples de performance5 dicas simples de performance
5 dicas simples de performance
 
[MinhaVida TechDay] NEO4J
[MinhaVida TechDay] NEO4J[MinhaVida TechDay] NEO4J
[MinhaVida TechDay] NEO4J
 
[MinhaVida TechDay] NoSQL
[MinhaVida TechDay] NoSQL[MinhaVida TechDay] NoSQL
[MinhaVida TechDay] NoSQL
 
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escala
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escalaTDC - Técnicas e recursos para desenvolvimento web em cenários de grande escala
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escala
 
IIS para desenvolvedores
IIS para desenvolvedoresIIS para desenvolvedores
IIS para desenvolvedores
 
LABjs e JQuery Templates
LABjs e JQuery TemplatesLABjs e JQuery Templates
LABjs e JQuery Templates
 
Novidades asp.net mvc 4
Novidades asp.net mvc 4Novidades asp.net mvc 4
Novidades asp.net mvc 4
 
ASP.NET MVC - O que tem de melhor
ASP.NET MVC - O que tem de melhorASP.NET MVC - O que tem de melhor
ASP.NET MVC - O que tem de melhor
 
Como trabalhar com ajax, json e cache
Como trabalhar com ajax, json e cacheComo trabalhar com ajax, json e cache
Como trabalhar com ajax, json e cache
 

Inversion ofcontrol

  • 1. DIP, IoC, DI, Service Locator e IoC Containers Um pouco sobre design de código
  • 2. Agenda • DIP - (Dependency Inversion Principle) • IoC (Inversion of Control) • DI (Dependency Injection) • IoC Containers página 2
  • 3. Alguns benefícios do que abordaremos • Baixo acoplamento entre classes • Essencial para se fazer testes de unidade (testabilidade) • Mocks e Stubs • Favorece um design mais flexível e extensível (extensibilidade) • Design plugável (componentização) • Normalmente promove maior reaproveitamento pois evita-se classes “FazTudo” (maior coesão e harmonia nas classes) • Muitos Design Patterns utilizam estes conceitos página 3
  • 4. Dependency Inversion Principle Um princípio de design OO página 4
  • 5. DIP – Dependency Inversion Principle • Bob Martin (Uncle Bob) • Criador dos princípios SOLID • Single responsibility principle • Open / closed principle • Liskov substitution principle • Interface segregation principle • Dependency inversion principle • http://www.objectmentor.com/resources/articles/dip.pdf (C++ em 1996) • Ajudou a iniciar toda essa paradinha de “Agile” • Escreveu uns livros legais página 5
  • 6. DIP – Dependency Inversion Principle Classes/Modulos de níveis mais altos não devem depender de classes/módulos de níveis mais baixos. Ambas devem depender de abstrações. High Level Class Interface Interface Interface Low Level Class Low Level Class Low Level Class página 6
  • 7. DIP – Dependency Inversion Principle Classes/Modulos de níveis mais altos não devem depender de classes/módulos de níveis mais baixos. Ambas devem depender de abstrações. High Level Class Interface Low Level Class Low Level Class Low Level Class página 7
  • 8. Inversion of Control Formas de como atingir o DIP página 8
  • 9. Inversion of Control O que é inversão de controle?? Dita quais as formas que podemos atingir o principio de inversão de dependência. Um conjunto de “padrões” para atingir o DIP • Interface inversion • Flow inversion • Creation Inversion Precisamos entender qual “controle” estamos tentando inverter. http://martinfowler.com/bliki/InversionOfControl.html página 9
  • 10. Inversion of Control Dependency Inversion (Principle) Inversion of Control (Pattern) Interface Inversion Flow Inversion Creation Inversion Dependency Injection página 10
  • 11. Interface Inversion Não use Interfaces sem saber o porque esta utilizando IBanana BancaDeFeira IPera ILaranja Pera Laranja IUva Uva página 11
  • 12. Interface Inversion Interfaces devem ter sempre mais de uma implementação ou um planejamento para isso IFruta BancaDeFeira Pera Uva Laranja página 12
  • 13. Flow Inversion Programa procedural/sequencial (fluxo definido pelo próprio programa) Programa com GUI, fluxo de entrada agora nas mãos dos usuários (Fluxo invertido) página 13
  • 14. Creation Inversion Normalmente criamos nossas classes assim: var meuObjeto = new MinhaClasse(); Criação do objeto é feita na classe onde o objeto será utilizado Mesmo com Interface Inversion você não necessariamente tem Creation Inversion: IFruta fruta = new Banana(); //Tipo concreto sendo instanciado na classe que //esta sendo utilizado Inverter o Controle aqui significa: Criar o objeto fora da classe onde ele será utilizado Tipos • Factory Pattern – Pessoa pessoa = PessoaFactory.Create(); • Service Locator – Pessoa pessoa = ServiceLocator.Create(IPessoa); • Dependency Injection • PessoaRepository pessoaRepository = new PessoaRepository(); HomeController homeController = new HomeController(pessoaRepository); página 14
  • 15. Dependency Injection Uma das maneiras de se inverter o controle página 15
  • 16. Dependency Injection É um tipo de IoC onde movemos a criação/binding da dependência para fora da classe que necessita de tal dependência. É forma pela qual associamos os tipos concretos a classes que dependem de abstrações. Podemos fazer isso de formas diferentes: Cuidado!!! • Construtor (Constructor Injection) – Mais utilizada • Propriedade (Setter Injection) – Mais ou menos utilizada Look Man! I'm injecting my dependencies • Interface (Interface Injection) – Nem vou perder meu tempo página 16
  • 18. IoC Containers Framework para DI página 18
  • 19. IoC Container Basicamente um framework que nos ajuda a fazer DI Existem vários (vários mesmo ) • Ninject - http://ninject.org/ - Segundo o Rodolfo o site mais bacanudo é deles :D • Unity - http://unity.codeplex.com/ - Da MS • Castle Windsor - http://stw.castleproject.org/Windsor.MainPage.ashx - Da Castle (bem utilizado por sinal) • Structure Map - http://structuremap.net/structuremap/ - Meu preferido, facinho • Xxx • Yyy Todos nos permitem configurar nosso container apontando qual classe concreta vai para nossas abstrações. Alguns permitem configuração via XML (da hora) Alguns permitem a criação de Interceptors (assunto para outra conversa) página 19
  • 20. DEMOnstração IoC Container com Structure Map página 20