Inversion ofcontrol
-
Upload
cleber-dantas -
Category
Documents
-
view
477 -
download
1
description
Transcript of Inversion ofcontrol
![Page 1: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/1.jpg)
DIP, IoC, DI, Service Locator e IoC ContainersUm pouco sobre design de código
![Page 2: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/2.jpg)
página 2
Agenda
• DIP - (Dependency Inversion Principle) • IoC (Inversion of Control)• DI (Dependency Injection)• IoC Containers
![Page 3: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/3.jpg)
página 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
![Page 4: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/4.jpg)
página 4
Dependency Inversion PrincipleUm princípio de design OO
![Page 5: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/5.jpg)
página 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
![Page 6: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/6.jpg)
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
Low Level Class
Interface
Low Level Class
Interface
Low Level Class
Interface
![Page 7: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/7.jpg)
página 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
Low Level Class
Interface
Low Level ClassLow Level Class
![Page 8: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/8.jpg)
página 8
Inversion of ControlFormas de como atingir o DIP
![Page 9: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/9.jpg)
página 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
![Page 10: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/10.jpg)
página 10
Inversion of Control
Dependency Inversion (Principle)
Inversion of Control (Pattern)
Interface Inversion Flow Inversion Creation Inversion
Dependency Injection
![Page 11: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/11.jpg)
página 11
Interface Inversion
IBanana BancaDeFeira
IPera
Pera
IUva
Uva
ILaranja
Laranja
Não use Interfaces sem saber o porque esta utilizando
![Page 12: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/12.jpg)
página 12
Interface Inversion
Interfaces devem ter sempre mais de uma implementação ou um planejamento para isso
IFruta BancaDeFeira
Pera
Uva
Laranja
![Page 13: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/13.jpg)
página 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)
![Page 14: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/14.jpg)
página 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 utilizadoInverter 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);
![Page 15: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/15.jpg)
página 15
Dependency InjectionUma das maneiras de se inverter o controle
![Page 16: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/16.jpg)
página 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:
• Construtor (Constructor Injection) – Mais utilizada• Propriedade (Setter Injection) – Mais ou menos utilizada• Interface (Interface Injection) – Nem vou perder meu tempoLook Man! I'm injecting my dependencies
Cuidado!!!
![Page 17: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/17.jpg)
página 17
DEMOnstraçãoDependency Injection
![Page 18: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/18.jpg)
página 18
IoC ContainersFramework para DI
![Page 19: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/19.jpg)
página 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)
![Page 20: Inversion ofcontrol](https://reader030.fdocuments.net/reader030/viewer/2022012910/546cf7c9b4af9f7f2c8b5272/html5/thumbnails/20.jpg)
página 20
DEMOnstraçãoIoC Container com Structure Map