В чем разница между декораторами @Injectable() и @Inject()?
Вопрос проверяет, как различаются два популярных декоратора в NestJS — @Injectable() и @Inject(), используемых для внедрения зависимостей.
Короткий ответ
Декоратор @Injectable() используется для пометки классов как "инъектируемых", то есть таких, что могут быть внедрены как зависимости в другие компоненты NestJS. Декоратор @Inject() используется для явного указания, какую зависимость внедрить в класс, если NestJS не может автоматически разрешить ее тип.
Длинный ответ
@Injectable() помечает класс как таковой, который может быть использован для внедрения зависимостей в другие классы. Этот декоратор автоматически разрешает зависимости через типы, указанные в конструкторе.
@Inject() используется, когда нужно вручную указать, какую зависимость нужно внедрить. Это может понадобиться, если NestJS не может автоматически определить зависимость по типу, или когда нужно использовать интерфейс или абстракцию для внедрения.
Пример:
@Injectable()
export class UserService {
constructor(private readonly userRepository: UserRepository) {}
}
@Injectable()
export class AppService {
constructor(@Inject(UserService) private readonly userService: UserService) {}
}В этом примере UserService помечен как инъектируемый класс, а AppService использует @Inject() для явного внедрения зависимости UserService.