Какова разница между Провайдером и Сервисами в NestJS? Можем ли мы иметь провайдер без декоратора @Injectable?
NestJS — это прогрессивный фреймворк для разработки серверных приложений на Node.js, который использует TypeScript. В NestJS ключевой концепцией являются "провайдеры" (providers) и "сервисы" (services). Давайте подробно рассмотрим их и их отличия.
Что такое Провайдеры и Сервисы в NestJS?
Различия между Провайдером и Сервисами
- Определение: Все сервисы — это провайдеры, но не все провайдеры являются сервисами. Провайдер может быть чем угодно (например, фабрики, значения, классы), в то время как сервисы обычно имеют более четкую бизнес-логическую роль.
- Назначение: Сервисы предназначены для реализации бизнес-логики, а провайдеры могут предоставлять больше функциональности и могут быть более общими.
Пример Создания Провайдера и Сервиса
Вот как можно реализовать провайдер и сервис.
Создание Сервиса
import { Injectable } from '@nestjs/common';
@Injectable()
export class UserService {
private users = [];
createUser(user: { name: string }) {
this.users.push(user);
return user;
}
findAllUsers() {
return this.users;
}
}
В этом примере UserService
— это сервис, который инкапсулирует логику для создания и поиска пользователей. Мы используем декоратор @Injectable()
, чтобы данный класс стал доступным для инъекции в другие классы.
Создание Провайдера без @Injectable
Так как любой класс можно сделать провайдером просто путем его добавления в массив провайдеров модуля, класс не обязательно должен быть помечен декоратором @Injectable
. Однако, если вы планируете использовать его для инъекции в другие классы, он должен быть инъектируемым.
Пример:
export class ConfigProvider {
getSecrets() {
return {
dbPassword: 'secret',
};
}
}
В этом примере мы создали провайдер ConfigProvider
, который предоставляет доступ к некоторым секретам. Хотя мы не используем @Injectable
, вы не сможете инъектировать ConfigProvider
в другие классы.
Пример Использования Провайдера и Сервиса в Модуле
import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { ConfigProvider } from './config.provider';
@Module({
providers: [UserService, ConfigProvider],
exports: [UserService],
})
export class UserModule {}
В этом примере мы регистрируем как сервис, так и провайдер в модуле. Сервис UserService
будет доступен для инъекции в другие классы, тогда как ConfigProvider
, не имея @Injectable
, не может быть инъектирован.
Заключение
В NestJS провайдеры и сервисы играют ключевую роль в структурировании вашего приложения. Понимание разных типов провайдеров и их использование поможет вам создавать более гибкие и поддерживаемые приложения.