PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые темы

Зачем нужен dependency injection?

Продвинутые темы

Dependency Injection (внедрение зависимостей) нужен, чтобы передавать зависимости объекту извне, а не создавать их внутри — это снижает связанность и упрощает тестирование и замену реализаций.

Проблема без DI

Объект сам создаёт зависимости — жёсткая связанность, трудно тестировать:

class UserService {
  constructor() {
    this.api = new HttpApi(); // жёстко зашито
  }
}

С DI

Зависимость передаётся снаружи:

class UserService {
  constructor(api) { // внедрено извне
    this.api = api;
  }
}

new UserService(new HttpApi()); // прод
new UserService(new MockApi()); // тест

Зачем нужен

  • Тестируемость — легко подставить мок вместо реальной зависимости.
  • Слабая связанность — зависимость от абстракции, а не конкретной реализации (принцип DIP из SOLID).
  • Гибкость — заменить реализацию без изменения потребителя.
  • Переиспользование — компонент не привязан к конкретным зависимостям.

Где встречается

  • Angular, NestJS — встроенные DI-контейнеры (провайдеры, инъекция через конструктор).
  • React — через props или Context (передача сервисов).

DI против Service Locator

  • DI — зависимости приходят извне (явно).
  • Service Locator — объект сам достаёт из реестра (скрыто, антипаттерн).

Коротко для собеседования

Dependency Injection передаёт зависимости объекту извне (через конструктор/props), а не создаёт внутри. Даёт тестируемость (подстановка моков), слабую связанность (зависимость от абстракций — принцип DIP), гибкость (замена реализации). Встроен в Angular/NestJS. Явнее и лучше Service Locator.

Другие вопросы раздела