В чем разница между Dependency Injection и Service Locator

«В чем разница между Dependency Injection и Service Locator» — вопрос из категории Паттерны, который задают на 10% собеседований Frontend Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Dependency Injection (DI) и Service Locator (SL) — это паттерны управления зависимостями, но с разными подходами.

DI внедряет зависимости извне (через конструктор, свойства или методы), делая их явными. Это упрощает тестирование и соблюдение принципа инверсии зависимостей (DIP).

class UserService {
  constructor(private db: Database) {} // DI через конструктор
}

Service Locator предоставляет централизованный контейнер, из которого зависимости запрашиваются внутри класса. Это скрывает зависимости, усложняя понимание кода и тестирование.

class UserService {
  private db = ServiceLocator.get<Database>('db'); // SL
}

Ключевые отличия:

  • DI прозрачен (зависимости видны), SL скрывает их.
  • DI упрощает мокирование для тестов, SL требует настройки контейнера.
  • DI следует принципу явных зависимостей, SL может привести к скрытым связям.