В чем разница между Dependency Injection и Service Locator?
Уровень: Senior
Ответ
Оба подхода решают проблему передачи зависимостей, но по-разному. При Dependency Injection (внедрение зависимостей) объекты получают необходимые зависимости явно (через параметры конструктора, сеттеры или инициализацию) — то есть зависимость передаётся извне, и класс ничего не знает, откуда она пришла. При паттерне Service Locator у класса есть доступ к некоему глобальному объекту-локатору (или контейнеру), у которого он запрашивает нужную зависимость по имени/типу. Разница: DI делает зависимости явными и видимыми в интерфейсе класса, облегчая тестирование (можно подставить mock) и понимание (сразу видно, что требуется). Service Locator скрывает зависимости: внутри метода класс может внезапно дернуть глобальный локатор, получить некую сервис-зависимость — для пользователя класса это не очевидно. Поэтому Service Locator критикуют: он по сути является глобальной переменной, усложняет тестирование (надо как-то подменять глобальный локатор), увеличивает связность. DI предпочитают за явность, хотя Service Locator иногда применяется для совместимости или когда DI трудно внедрить.