Quinta-feira, Março 29, 2007

Pequena Introdução à Dependency Injection

Um software é composto por uma série de componentes que interagem e colaboram entre si. Tais componentes podem ser classificados como clientes, que dependem de outros componentes para cumprir seus objetivos, e os provedores de serviços (services, ou ainda, server components), que executam tarefas conforme requisitados pelos clientes.

Para que clientes utilizem serviços é preciso, antes, encontrar (look up), e instanciar os provedores de serviços. Deixar essa tarefa sob incumbência do cliente pode não ser a melhor opção.

Dependency Injection (DI) é uma forma moderna e eficaz de "plugar" serviços nos clientes, deixando o trabalho de procura, instanciação e inicialização para o responsável pela DI. Dessa forma, os clientes apenas precisam declarar suas dependências para que os serviços sejam injetados nos mesmos, em tempo de execução, thread safety e sem utilizar API's.

A implementação da injeção de dependência pode ser feita através de código próprio ou por containers, como Spring Framework, PicoContainer, HiveMind, XWork e EJB 3.0.

O container sabe qual componente deve ser injetado através de arquivos de configuração XML, assinatura de métodos (propriedades JavaBeans ou construtores) ou metadados. Há outros meios mais incomuns para isso, como através de interfaces (type 1 IoC).

Benefícios da Dependency Injection

  • Componentes mais fáceis de manter, justamente por dispensar lógica para ter acesso aos services
  • Dependências são explicitas e evidentes, tornando o código-fonte mais claro e o desenvolvimento mais simples
  • Maior facilidade para fazer testes de unidade
  • Preserva strong typing, eliminando os riscos de ClassCastException.

E Sobre IoC ?


Inversion of Control (IoC) é um termo genérico para um padrão onde o controle e responsabilidade de uma atividade é invertido entre os participantes. Esse conceito é, por vezes, chamado divertidamente de Princípio de Hollywood: "Don't call us, We'll call you", ou, em português, "Não nos telefone; Nós ligaremos para você".

Dependency Injection é uma forma mais específica de IoC, cujo objetivo é eliminar dependências explicitas entre componentes e "externalizar" dos clientes a rotina para acesso aos provedores de serviços.

Ao invés do cliente executar a lógica necessária para obter uma referência ao service do qual é dependente para executar suas tarefas, o container se encarrega de obter e injetar esse componente no cliente. Daí a inversão de controle.

Leitura Recomendada:
Fontes Utilizadas: