Ответ
Service Locator и Dependency Injection (DI) — оба подхода для управления зависимостями, но работают по-разному.
Service Locator — это контейнер, который предоставляет зависимости по запросу (через явный вызов). Клиентский код сам запрашивает нужный сервис.
Пример:
val service = ServiceLocator.getService<MyService>()
DI — зависимости передаются в класс извне (через конструктор, методы или поля). Класс не знает, как их получить.
Пример:
class MyViewModel(private val repo: MyRepository) { ... }
Ключевые отличия:
- Явность — Service Locator скрывает зависимости (их сложнее отследить), DI делает их явными.
- Тестируемость — DI упрощает мокирование, так как зависимости легко подменить.
- Инверсия управления — DI строже следует принципу IoC.
Вывод: DI предпочтительнее из-за прозрачности и тестируемости, но Service Locator иногда удобен для legacy-кода.