Поиск по сайту
Ctrl + K
Вопросы по Nest.js

В чем разница между декораторами @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() позволяет вам указать, какие конкретные зависимости вы хотите получить. Их совместное использование позволяет создавать гибкие и масштабируемые приложения.

    Содержание:
    Редактировать