SlideShare una empresa de Scribd logo
1 de 9
Dependency Injection 
Breno Queiroz 
Sócio Propietário – studiows3 
@brenofqueiroz 
Bruno Brandes 
Sócio Propietário – studiows3 
@brunobrandes
O que é? 
Padrão utilizado para desenvolver sistemas em que 
o nível de acoplamento entre seus diferentes 
módulos precisem ser extremamente baixos. 
Em linhas gerais este padrão é uma das formas de 
implementar um outro padrão - Inversão de 
Controle.
Benefícios 
A função principal deste Pattern é oferecer uma estrutura de 
baixo acoplamento, visando os seguintes benefícios: 
 Oferecer reusabilidade de componentes. 
 Facilitar a manutenção de Sistemas. 
 Criar códigos altamente “testáveis”. 
 Criar códigos mais legíveis
Meios de Implementação 
 Contructor. 
Nesta metodologia, passamos a referência de objeto no próprio construtor. 
Deste modo, quando criarmos uma instância da classe, podemos definir o 
tipo do objeto que queremos. 
 Properties. 
Nela a dependência dos objetos é exposta nas propriedades Get e Set das 
classes.
Exemplo 
public class OrderEngine 
{ 
public List<Order> GetOrders() 
{ 
var orderReposity = new OrderReposity(); 
return orderReposity.GetAll(); 
} 
} 
O problema com o código acima é o alto acoplamento. A classe 
OrderEngine é responsável por instanciar o repositório, por isso dizemos 
que ela tem dependência da classe OrderRepository.
Como resolvemos? 
public class OrderEngine 
{ 
private readonly IOrderReposity _orderReposity; 
public OrderEngine(IOrderReposity orderReposity) 
{ 
_orderReposity = orderReposity; 
} 
public List<Order> GetOrders() 
{ 
return _orderReposity.GetAll(); 
} 
} 
Através da Inversão de Controle. 
Com isso, chegamos aos princípios do 
S.O.L.I.D 
Constructor Methodology 
“Módulos de alto nível não devem depender de módulos de baixo nível, ambos devem depender de abstrações.”
Frameworks 
 Ninject 
 Unity 
 Castle.Windsor 
 Autofac 
 StructureMap 
 SimpleInjector
Simple Injector 
Principal tipo Simples Injector é a classe 
Container. 
Uma instância de Container é usado para 
registrar mapeamentos entre uma abstração 
(serviço) e implementação (componente). 
O papel do Container para fornecer o 
aplicativo com a implementação direita
Exemplo 
O ideal é que um único lugar de uma aplicação deve fazer 
referência direta e usar Simple Injector 
O uso de Simple Injector consiste em quatro ou cinco 
passos simples: 
1. Criar um novo recipiente. 
2. Configurar o recipiente (registro). 
3. Opcionalmente verificar o recipiente. 
4. Armazenar o recipiente para utilização pela aplicação. 
5. Recuperar instâncias do recipiente (resolver).

Más contenido relacionado

Similar a Dependency Injection: baixo acoplamento e testabilidade

Treinamento Básico Sobre ASP.NET MVC
Treinamento Básico Sobre ASP.NET MVCTreinamento Básico Sobre ASP.NET MVC
Treinamento Básico Sobre ASP.NET MVCMichael Costa
 
Dicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.x
Dicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.xDicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.x
Dicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.xRodrigo Kono
 
Introdução ASP.NET Core
Introdução ASP.NET CoreIntrodução ASP.NET Core
Introdução ASP.NET Corelacerda2
 
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)Rafael Oliveira
 
ASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre TarifaASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre Tarifaguestea329c
 
Padrões-05 - Padrões Arquiteturais - MVC
Padrões-05 - Padrões Arquiteturais - MVCPadrões-05 - Padrões Arquiteturais - MVC
Padrões-05 - Padrões Arquiteturais - MVCEduardo Nicola F. Zagari
 
Desenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São CarlosDesenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São CarlosRodolfo Fadino Junior
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsEduardo Mendes
 
Apresentação mvc
Apresentação mvcApresentação mvc
Apresentação mvcleopp
 
Construção de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em JavaConstrução de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em JavaFernando Camargo
 
ASP.Net MVC 3 - o que há de novo (TechEd)
ASP.Net MVC 3 - o que há de novo (TechEd)ASP.Net MVC 3 - o que há de novo (TechEd)
ASP.Net MVC 3 - o que há de novo (TechEd)Giovanni Bassi
 

Similar a Dependency Injection: baixo acoplamento e testabilidade (20)

Treinamento Básico Sobre ASP.NET MVC
Treinamento Básico Sobre ASP.NET MVCTreinamento Básico Sobre ASP.NET MVC
Treinamento Básico Sobre ASP.NET MVC
 
Aula1
Aula1Aula1
Aula1
 
Apresentação M V C
Apresentação M V CApresentação M V C
Apresentação M V C
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 
Dicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.x
Dicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.xDicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.x
Dicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.x
 
Introdução ASP.NET Core
Introdução ASP.NET CoreIntrodução ASP.NET Core
Introdução ASP.NET Core
 
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
 
Prog web 08-php-mvc
Prog web 08-php-mvcProg web 08-php-mvc
Prog web 08-php-mvc
 
ASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre TarifaASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre Tarifa
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Padrões-05 - Padrões Arquiteturais - MVC
Padrões-05 - Padrões Arquiteturais - MVCPadrões-05 - Padrões Arquiteturais - MVC
Padrões-05 - Padrões Arquiteturais - MVC
 
Desenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São CarlosDesenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São Carlos
 
Conhecendo o Spring
Conhecendo o SpringConhecendo o Spring
Conhecendo o Spring
 
Asp net mvc
Asp net mvcAsp net mvc
Asp net mvc
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
 
Programando php com excelência
Programando php com excelênciaProgramando php com excelência
Programando php com excelência
 
Angular 2
Angular 2Angular 2
Angular 2
 
Apresentação mvc
Apresentação mvcApresentação mvc
Apresentação mvc
 
Construção de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em JavaConstrução de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em Java
 
ASP.Net MVC 3 - o que há de novo (TechEd)
ASP.Net MVC 3 - o que há de novo (TechEd)ASP.Net MVC 3 - o que há de novo (TechEd)
ASP.Net MVC 3 - o que há de novo (TechEd)
 

Dependency Injection: baixo acoplamento e testabilidade

  • 1. Dependency Injection Breno Queiroz Sócio Propietário – studiows3 @brenofqueiroz Bruno Brandes Sócio Propietário – studiows3 @brunobrandes
  • 2. O que é? Padrão utilizado para desenvolver sistemas em que o nível de acoplamento entre seus diferentes módulos precisem ser extremamente baixos. Em linhas gerais este padrão é uma das formas de implementar um outro padrão - Inversão de Controle.
  • 3. Benefícios A função principal deste Pattern é oferecer uma estrutura de baixo acoplamento, visando os seguintes benefícios:  Oferecer reusabilidade de componentes.  Facilitar a manutenção de Sistemas.  Criar códigos altamente “testáveis”.  Criar códigos mais legíveis
  • 4. Meios de Implementação  Contructor. Nesta metodologia, passamos a referência de objeto no próprio construtor. Deste modo, quando criarmos uma instância da classe, podemos definir o tipo do objeto que queremos.  Properties. Nela a dependência dos objetos é exposta nas propriedades Get e Set das classes.
  • 5. Exemplo public class OrderEngine { public List<Order> GetOrders() { var orderReposity = new OrderReposity(); return orderReposity.GetAll(); } } O problema com o código acima é o alto acoplamento. A classe OrderEngine é responsável por instanciar o repositório, por isso dizemos que ela tem dependência da classe OrderRepository.
  • 6. Como resolvemos? public class OrderEngine { private readonly IOrderReposity _orderReposity; public OrderEngine(IOrderReposity orderReposity) { _orderReposity = orderReposity; } public List<Order> GetOrders() { return _orderReposity.GetAll(); } } Através da Inversão de Controle. Com isso, chegamos aos princípios do S.O.L.I.D Constructor Methodology “Módulos de alto nível não devem depender de módulos de baixo nível, ambos devem depender de abstrações.”
  • 7. Frameworks  Ninject  Unity  Castle.Windsor  Autofac  StructureMap  SimpleInjector
  • 8. Simple Injector Principal tipo Simples Injector é a classe Container. Uma instância de Container é usado para registrar mapeamentos entre uma abstração (serviço) e implementação (componente). O papel do Container para fornecer o aplicativo com a implementação direita
  • 9. Exemplo O ideal é que um único lugar de uma aplicação deve fazer referência direta e usar Simple Injector O uso de Simple Injector consiste em quatro ou cinco passos simples: 1. Criar um novo recipiente. 2. Configurar o recipiente (registro). 3. Opcionalmente verificar o recipiente. 4. Armazenar o recipiente para utilização pela aplicação. 5. Recuperar instâncias do recipiente (resolver).

Notas del editor

  1. acoplamento é uma conexão ou dependência ou até mesmo interação entre diversos módulos/sistemas de um projeto de software. Quanto maior for o acoplamento entre os diversos módulos de um sistema, maior a dependencia destes. Porém quanto maior o nível de dependência dos módulos, mais difícil e trabalhosa é a manutenção dos mesmos.
  2. A) Constructor => Modo em que implementamos a injeção de dependência na definição dos construtores das classes; B) Getter and Setter => Modo em que implementamos a injeção de dependência na definição dos Gets e Sets das classes; Essa metodologia possui alguns pontos negativos, pois a injeção de dependência nas propriedades Get e Set quebra alguns conceitos e regras do encapsulamento, ou seja, iremos realizar algo que vai contra os preceitos da orientação a objetos. C) Interface Implementation => Modo em que se usa a definição de Interfaces para realizar a injeção de dependência; D) Service Locator => Modo em que construímos classes que servem como “localizadoras” de objetos que iremos instanciar em nossas outras classes.
  3. Nesse caso, qualquer alteração no repositório de pedidos, vai afetar diretamente a engine. O repositório, por sua vez, utiliza uma conexão ao banco de dados para obter os produtos, então seu controller também está dependente disso! Você pode pensar que nunca irá mudar essa conexão, mas e seus testes unitários? Eles devem independer de acesso ao banco de dados, mas utilizando o código acima, ao testar seu controller de pedidos, ele irá instanciar a classe repositorio que vai precisar da conexão. Se você desenvolve com TDD, já deve ter percebido o problema. Para testar o controller acima, não conseguimos "mockar" o repositório!
  4.  Inversão de Controle. Quer dizer que vamos inverter o controle na classe principal, tirando a responsabilidade dela sobre classes que ela utiliza e passando essa responsabilidade para outra classe, interface, componente, etc. S.O.L.I.D => Single responsibility, Open-closed, Liskov substitution, Interface segregation and Dependency inversion
  5. A maneira mais fácil de olhar para um Container é como um grande dicionário onde o tipo de abstração é usado como chave, e seu valor é a definição de como criar a sua implementação. Quando o aplicativo solicita um serviço, ele é procurado no dicionário, e retorna a correta aplicação.