IoC - это концепция отделения приложения от реализации службы, которую он использует.
Это правда, что IoC идет рука об руку с развязкой интерфейсов от реализаций, но я вижу,это как более общий принцип. Этот ответ SO дает очень хорошее объяснение концепции.
Существует как минимум два способа добиться этого:
1) DI
2) ServiceLocator
Я бы не сказал, что шаблон Service Locator является примером инверсии управления.Скорее наоборот - когда вы используете сервисный локатор, вы активно приобретаете требуемые зависимости, никто больше не делает это за вас (в отличие от DI, где контейнер обрабатывает зависимости для вас, вы просто должны дать емувозможность сделать это - установщик, параметр конструктора или путем реализации метода интерфейса ввода).
Как локатор более прост?потому что он использует вызов метода явно?
Я думаю, что Мартин Фаулер ссылается на общую идею IoC, которая может усложнить понимание кода, если вы никогда не видели концепцию IoC / DI, использованную ранее,С другой стороны, код, использующий Service Locator для получения некоторых зависимостей, может быть легче понять при первом обращении.
Что лучше использовать DI при наличии нескольких приложений?
Когда вы создаете компонент, который предполагается использовать повторно, преимущество DI состоит в том, что он не делает ваш компонент зависимым ни от чего, кроме исходной зависимости (в примере MF, MovieLister зависит только от MovieFinderинтерфейс при использовании DI).Кроме того, другим пользователям довольно просто использовать ваш компонент - нужно просто передать зависимости, используя предоставленные вами средства DI.
При использовании локатора службы вы также добавляете зависимость от интерфейса службыСам локатор.С отдельным интерфейсом для локатора это может не быть проблемой.Но пользователям вашего компонента также может быть труднее удовлетворить зависимости вашего компонента, как пишет MF:
Разница возникает, если список - это компонент, который я предоставляю приложению, котороедругие люди пишут.В этом случае я мало что знаю об API локаторов сервисов, которые собираются использовать мои клиенты.У каждого клиента могут быть свои несовместимые сервисные локаторы.