В чем разница между шаблонами Dependency Injection и Service Locator?

Обе модели кажутся реализацией принципа инверсии управления. То есть объект не должен знать, как построить свои зависимости.

Внедрение зависимостей (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-контейнеры в основном, когда у нас много зависимостей?

Ответы на вопрос(13)

Ваш ответ на вопрос