Entrambi i modelli sembrano un'implementazione del principio di inversione del controllo. Cioè, un oggetto non dovrebbe sapere come costruirne le dipendenze.
Dependency Injection (DI) sembra usare un costruttore o setter per "iniettare" le sue dipendenze.
Esempio di utilizzo dell'iniezione costruttore:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo(IBar bar)
{
this.bar = bar;
}
//...
}
Service Locator sembra usare un "contenitore", che collega le sue dipendenze e dà alla sua barra.
Esempio di utilizzo di un Service Locator:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo()
{
this.bar = Container.Get<IBar>();
}
//...
}
Poiché le nostre dipendenze sono solo oggetti stessi, queste dipendenze hanno dipendenze, che hanno ancora più dipendenze e così via e così via. Nacque così l'Inversion of Control Container (o DI Container). Esempi: Castle Windsor, Ninject, Map Structure, Spring, ecc.)
Ma un contenitore IOC / DI si presenta esattamente come un localizzatore di servizi. Chiamarlo contenitore DI è un brutto nome? Un container IOC / DI è solo un altro tipo di Service Locator? La sfumatura sta nel fatto che usiamo DI Container principalmente quando abbiamo molte dipendenze?