Что такое пользовательские провайдеры и чем они отличаются от стандартных провайдеров в NestJS?
NestJS — это мощный фреймворк для построения серверных приложений на TypeScript, который использует модульную архитектуру. В NestJS провайдеры (Providers) являются основным строительным блоком, который требуется для внедрения зависимостей (Dependency Injection). В этой статье мы рассмотрим пользовательские провайдеры и их отличие от стандартных.
Что такое провайдеры?
Провайдеры в NestJS — это классы, создающие и предоставляющие экземпляры, которые можно внедрять в другие классы через конструкторы. Они могут представлять собой сервисы, репозитории, фабрики и другие объекты.
Пример стандартного провайдера:
import { Injectable } from '@nestjs/common';
@Injectable()
export class CatsService {
private readonly cats = [];
addCat(cat: string) {
this.cats.push(cat);
}
getCats() {
return this.cats;
}
}
Пользовательские провайдеры
Пользовательские провайдеры (Custom Providers) — это более гибкий способ создания провайдеров, который позволяет разрабатывать и регистрировать провайдеры, используя различные механизмы, такие как функции, значения или даже динамическое создание. Это позволяет улучшить модульность и предсказуемость кода.
Как создать пользовательский провайдер?
Вы можете создать пользовательский провайдер, используя useFactory
, useClass
или useValue
.
import { Injectable } from '@nestjs/common';
@Injectable()
export class MyService {
// Пожалуй, это один из самых простых примеров пользовательского провайдера
}
@Module({
providers: [
{ provide: 'MyToken', useClass: MyService },
],
})
export class MyModule {}
const myValue = { name: 'MyValue' };
@Module({
providers: [
{ provide: 'MyValueToken', useValue: myValue },
],
})
export class MyModule {}
const myFactory = () => {
return { name: 'FactoryValue' };
};
@Module({
providers: [
{ provide: 'FactoryToken', useFactory: myFactory },
],
})
export class MyModule {}
Разница между стандартными и пользовательскими провайдерами
- Стандартные провайдеры объявляются с помощью декоратора
@Injectable()
. - Пользовательские провайдеры могут быть созданы с помощью функции, класса, значения или даже других компонентов и функций, которые возвращают требуемый экземпляр.
- Стандартные провайдеры могут быть легко внедрены, но если вам нужно создать провайдер с динамической логикой или конфигурацией, вам нужны пользовательские провайдеры.
- Пользовательские провайдеры могут упростить процесс создания поддельных (mock) провайдеров для тестирования, поскольку они могут предоставлять зависимости, основанные на окружении.
Заключение
Пользовательские провайдеры в NestJS предоставляют разработчикам возможность создавать более гибкие и мощные механизмы внедрения зависимостей. Понимание различий между стандартными и пользовательскими провайдерами поможет вам лучше организовать ваш код и упростить проектирование сложных приложений.