Injeção de Dependência é um nome horrível (IMO) 1 para um conceito bastante direto. Aqui está um exemplo:
- Você tem um método (ou classe com métodos) que executa o X (por exemplo, recuperar dados do banco de dados)
- Como parte da execução do X, o referido método cria e gerencia um recurso interno (por exemplo, a
DbContext
). Esse recurso interno é chamado de dependência
- Você remove a criação e o gerenciamento do recurso (ou seja
DbContext
) do método e torna responsabilidade do chamador fornecer esse recurso (como parâmetro do método ou por instanciação da classe)
- Agora você está fazendo injeção de dependência.
[1] : Eu sou de nível inferior e levei meses para me sentar e aprender a injeção de dependência, porque o nome indica que seria algo muito mais complicado, como DLL Injection . O fato de o Visual Studio (e nós desenvolvedores em geral) se referir às bibliotecas .NET (DLLs ou assemblies ) dos quais um projeto depende, pois as dependências não ajuda em nada. Existe até o Walker de Dependências (depends.exe) .
[Editar] Imaginei que algum código de demonstração seria útil para alguns, então aqui está um (em C #).
Sem injeção de dependência:
public class Repository : IDisposable
{
protected DbContext Context { get; }
public Repository()
{
Context = new DbContext("name=MyEntities");
}
public void Dispose()
{
Context.Dispose();
}
}
Seu consumidor faria algo como:
using ( var repository = new Repository() )
{
// work
}
A mesma classe implementada com padrão de injeção de dependência seria assim:
public class RepositoryWithDI
{
protected DbContext Context { get; }
public RepositoryWithDI(DbContext context)
{
Context = context;
}
}
Agora é responsabilidade do chamador instanciar DbContext
e passar (errar, injetar ) para sua classe:
using ( var context = new DbContext("name=MyEntities") )
{
var repository = new RepositoryWithDI(context);
// work
}