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

Что такое пользовательские провайдеры и чем они отличаются от стандартных провайдеров в 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.

  • Используя useClass
  • import { Injectable } from '@nestjs/common';
    
    @Injectable()
    export class MyService {
        // Пожалуй, это один из самых простых примеров пользовательского провайдера
    }
    
    @Module({
        providers: [
            { provide: 'MyToken', useClass: MyService },
        ],
    })
    export class MyModule {}
    
  • Используя useValue
  • const myValue = { name: 'MyValue' };
    
    @Module({
        providers: [
            { provide: 'MyValueToken', useValue: myValue },
        ],
    })
    export class MyModule {}
    
  • Используя useFactory
  • const myFactory = () => {
        return { name: 'FactoryValue' };
    };
    
    @Module({
        providers: [
            { provide: 'FactoryToken', useFactory: myFactory },
        ],
    })
    export class MyModule {}
    

    Разница между стандартными и пользовательскими провайдерами

  • Способ определения:
    • Стандартные провайдеры объявляются с помощью декоратора @Injectable().
    • Пользовательские провайдеры могут быть созданы с помощью функции, класса, значения или даже других компонентов и функций, которые возвращают требуемый экземпляр.
  • Гибкость:
    • Стандартные провайдеры могут быть легко внедрены, но если вам нужно создать провайдер с динамической логикой или конфигурацией, вам нужны пользовательские провайдеры.
  • Тестируемость:
    • Пользовательские провайдеры могут упростить процесс создания поддельных (mock) провайдеров для тестирования, поскольку они могут предоставлять зависимости, основанные на окружении.
  • Заключение

    Пользовательские провайдеры в NestJS предоставляют разработчикам возможность создавать более гибкие и мощные механизмы внедрения зависимостей. Понимание различий между стандартными и пользовательскими провайдерами поможет вам лучше организовать ваш код и упростить проектирование сложных приложений.