Ambos os padrões parecem uma implementação do princípio de inversão de controle. Ou seja, que um objeto não deve saber como construir suas dependências.
A Injeção de Dependência (DI) parece usar um construtor ou setter para "injetar" suas dependências.
Exemplo de uso de injeção de construtor:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo(IBar bar)
{
this.bar = bar;
}
//...
}
O Localizador de Serviço parece usar um "contêiner", que conecta suas dependências e fornece a ele sua barra.
Exemplo de uso de um localizador de serviço:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo()
{
this.bar = Container.Get<IBar>();
}
//...
}
Como nossas dependências são apenas objetos, essas dependências têm dependências, que têm ainda mais dependências, e assim por diante. Assim, nasceu o Inversion of Control Container (ou DI Container). Exemplos: Castelo Windsor, Ninject, Mapa da Estrutura, Primavera, etc.)
Mas um contêiner IOC / DI se parece exatamente com um localizador de serviço. Está chamando de Container DI um nome ruim? Um contêiner IOC / DI é apenas outro tipo de localizador de serviço? A nuance é o fato de usarmos DI Containers principalmente quando temos muitas dependências?