Обе модели кажутся реализацией принципа инверсии управления. То есть объект не должен знать, как построить свои зависимости.
Внедрение зависимостей (DI), похоже, использует конструктор или установщик для «внедрения» своих зависимостей.
Пример использования Constructor Injection:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo(IBar bar)
{
this.bar = bar;
}
//...
}
Сервисный локатор, по-видимому, использует «контейнер», который связывает свои зависимости и дает foo его bar.
Пример использования сервисного локатора:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo()
{
this.bar = Container.Get<IBar>();
}
//...
}
Поскольку наши зависимости являются просто самими объектами, эти зависимости имеют зависимости, которые имеют еще больше зависимостей, и так далее, и тому подобное. Таким образом, Инверсия Контейнера Контроля (или Контейнера DI) родилась. Примеры: Замок Виндзор, Нинъект, Карта структуры, Весна и т. Д.)
Но Контейнер IOC / DI выглядит точно так же, как Сервисный Локатор. Называет ли это контейнер DI плохим именем? Контейнер IOC / DI - это просто другой тип сервисного локатора? Есть ли нюанс в том, что мы используем DI-контейнеры в основном, когда у нас много зависимостей?