Оба шаблона кажутся реализацией принципа инверсии управления. То есть, объект не должен знать, как построить его зависимости.
Инъекция зависимостей (DI), по-видимому, использует конструктор или сеттер для "инъекции" его зависимостей.
Пример использования инжекции конструктора:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo(IBar bar)
{
this.bar = bar;
}
//...
}
Локатор сервисов, похоже, использует "контейнер", который связывает свои зависимости и дает foo it bar.
Пример использования локатора служб:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo()
{
this.bar = Container.Get<IBar>();
}
//...
}
Поскольку наши зависимости - это только сами объекты, эти зависимости имеют зависимости, которые имеют еще больше зависимостей и т.д. и т.д. Таким образом, возникла инверсия контрольного контейнера (или контейнера DI). Примеры: Castle Windsor, Ninject, Карта структуры, Spring и т.д.)
Но контейнер IOC/DI выглядит точно как локатор сервисов. Называет ли это контейнер DI плохим именем? Является ли контейнер IOC/DI только другим типом локатора сервисов? Является ли нюанс тем фактом, что мы используем контейнеры DI в основном, когда у нас много зависимостей?