Проверяет понимание механизма внедрения зависимостей в NestJS и роли декоратора @Injectable при построении DI-контейнера.
Dependency Injection (DI) — это паттерн, при котором объект не создаёт свои зависимости сам, а получает их извне. В NestJS эту роль выполняет встроенный DI-контейнер: он анализирует метаданные классов, строит граф зависимостей и создаёт экземпляры в нужном порядке. Это упрощает тестирование, повторное использование кода и замену реализаций.
Декоратор @Injectable() сообщает Nest, что класс может быть управляемым провайдером. Он добавляет метаданные, по которым контейнер понимает, какие зависимости нужно внедрить через конструктор. Без этого декоратора Nest не сможет корректно разрешить зависимости при внедрении.
@Module({ providers: [...] }).import { Injectable } from '@nestjs/common';
@Injectable()
export class UsersService {
private users = [];
findAll() { return this.users; }
}
@Injectable()
export class UsersController {
constructor(private usersService: UsersService) {}
getUsers() { return this.usersService.findAll(); }
}
@Module({
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}Здесь Nest создаёт UsersService и передаёт его в конструктор UsersController. Если заменить реализацию через useClass или useValue, контроллер об этом не узнает — это и есть преимущество DI.
По умолчанию провайдеры singleton — один экземпляр на приложение. Можно задать Scope.REQUEST или Scope.TRANSIENT, если нужен новый экземпляр на каждый запрос или внедрение.
Итог: DI-контейнер и @Injectable позволяют писать слабосвязанный, тестируемый код, где зависимости подставляются автоматически. Применяйте их всегда, когда класс зависит от других сервисов, репозиториев или конфигураций.