Я задал этот вопрос 3 года назад и с тех пор начал понимать и любить ДИ в статически типизированных языках.
Похоже, что когда я задал этот вопрос, я не понял разницу между «Service Locator» и «Dependency Injection Container» (DIC).
DIC работает «под» приложением и отвечает за построение объектов и построение графа объектов, как правило, во время начальной загрузки, но до приложения, если оно полностью загружено. Классы не должны знать о DIC и не должны зависеть от него. DIC должен создавать все зависимости класса и внедрять их, как если бы класс создавался вручную.
Сервисный локатор - это объект, который передается по системе и используется для поиска зависимостей. Использование локатора сервиса скрывает зависимости (первоначальная проблема, которую я заметил, когда изучал этот материал) и создает общесистемную зависимость (то есть сам локатор службы).
Как правило, я бы избегал шаблона поиска сервисов (некоторые называют его «анти-шаблоном»). Использование хорошего DIC, такого как DIC от Ninject или Symfony 2, позволит вашим классам сосредоточиться на бизнес-логике, а не на поиске зависимостей.
Прочтите статью Мартина Фаулерса о внедрении зависимости: http://www.martinfowler.com/articles/injection.html