Зачем нужен 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.