Anúncio
Anúncio

Mais conteúdo relacionado

Último(20)

Anúncio

[Software Design Pattern] - Dependency Injection

  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 do 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.
Anúncio