Continuamos a série “Padrões de DI”, mostrando uma terceira forma de injetarmos dependências: Method Injection.
1. O QUE É
Como o próprio nome diz, Method Injection é um padrão de DI que consiste em fornecer a dependência como parâmetro de um método.
2. QUANDO USAR
Ao contrário de Constructor Injection e Property Injection, com Method Injection, a dependência não é resolvida em um Composition Root e sim, em tempo de invocação do método.
Em outras palavras, nós já temos uma instância da dependência e desejamos passá-la adiante para algum consumidor. Portanto, ele se adequa bem quando, para cada chamada do método, precisamos passar uma implementação diferente da dependência.
3. COMO IMPLEMENTAR
A implementação é trivial (o exemplo é meramente didático):
public class SimuladorDeInadimplencia
{
//.....
// dependência IEstrategiaDeReajuste
// passada por parâmetro
public IEnumerable Aplicar(
IEstrategiaDeReajuste reajuste)
{
// guard-clause
if (reajuste == null)
throw new ArgumentNullException("reajuste");
var parcelasVencidas =
this.parcelaRepositorio.ObterAsVencidas();
// utilização da dependência para
// gerar uma parcela reajustada
return parcelasVencidas
.Select(p => reajuste.AplicarEm(p));
}
}
Simples, não?
Ao receber a dependência como parâmetro, estamos deixando claro que ela é exigida apenas naquele método, além de permitirmos que instâncias diferentes sejam passadas ao mesmo objeto Simulador, sem a necessidade de instancia-lo novamente:
// alguma classe que usa o simulador
//.....
var estrategiasDeReajuste = ObterTodas();
foreach(var estrategia in estrategiasDeReajuste)
{
var parcelasReajustadas =
this.simulador.Aplicar(estrategia);
FazAlgo(parcelasReajustadas);
}
//.....
(O conjunto de estratégias poderia ser criada a partir da entrada do usuário ou de um arquivo de configuração.)
4. CONCLUSÃO
Com Method Injection já possuímos a dependência e queremos passá-la adiante (como parâmetro) para seu consumidor.
É menos comum que Constructor Injection e Property Injection, mas é uma boa opção principalmente quando queremos variar a implementação da dependência para o mesmo objeto consumidor.
No próximo artigo, encerro esta série com outro padrão, ainda mais específico.
» Continuar para [Parte 7 – Ambient Context]
Participe! Vamos trocar uma ideia sobre desenvolvimento de software!