В чем разница между декораторами @Injectable() и @Inject()?
В NestJS, фреймворке для создания серверных приложений на Node.js, существуют различные декораторы, которые облегчают работу с зависимостями и инъекциями. Два из наиболее часто используемых декораторов — это @Injectable()
и @Inject()
. Рассмотрим их отличие и области применения.
Декоратор @Injectable()
@Injectable()
декоратор используется для определения класса как службы (service). Это значит, что экземпляры такого класса могут быть созданы и управляемы NestJS и могут быть использованы в качестве зависимостей в других классах, таких как контроллеры и другие сервисы.
Пример использования @Injectable()
:
import { Injectable } from '@nestjs/common';
@Injectable()
export class UsersService {
private users = [];
addUser(user: any) {
this.users.push(user);
}
findAll() {
return this.users;
}
}
В этом примере UsersService
помечен декоратором @Injectable()
, что позволяет NestJS управлять его жизненным циклом и инъекцией в другие классы.
Декоратор @Inject()
@Inject()
декоратор используется для явной инъекции зависимости в класс. Он применяется, когда зависит от конкретного провайдера, особенно если необходимо переопределить имя зависимости или тип.
Пример использования @Inject()
:
import { Injectable, Inject } from '@nestjs/common';
import { DATABASE_CONNECTION } from './database.constants';
@Injectable()
export class UsersService {
constructor(
@Inject(DATABASE_CONNECTION) private dbConnection: any,
) {}
async findAll() {
return await this.dbConnection.query('SELECT * FROM users');
}
}
В этом примере @Inject(DATABASE_CONNECTION)
используется для инъекции конкретного провайдера, который был зарегистрирован в модуле. Обычно этот декоратор используется, когда вы хотите инъектировать зависимости, которые не имеют соответствующего типа в NestJS.
Основные отличия
@Injectable()
предназначен для объявления класса как службы, чтобы NestJS мог управлять его экземплярами.@Inject()
используется для инъекции конкретных зависимостей в классы и позволяет явно указать, какую зависимость нужно инъекцировать.
@Injectable()
применяется на уровне классов.@Inject()
применяется на уровне конструктора и позволяет указать, какие именно зависимости необходимы для данного класса.
Заключение
Понимание различий между @Injectable()
и @Inject()
и их правильное использование — это важная часть работы с зависимостями в NestJS. В то время как @Injectable()
объявляет сущность как пригодную для инъекции, @Inject()
позволяет вам указать, какие конкретные зависимости вы хотите получить. Их совместное использование позволяет создавать гибкие и масштабируемые приложения.