Убедитесь, что ваши модули хорошо организованы с помощью чистых и многоразовых инъекций.

Внедрение службы из другого модуля Nest.js включает в себя несколько шагов, обеспечивающих правильное внедрение зависимостей и организацию модуля. Используя два примера модулей, узнайте, как работает процесс экспорта и импорта услуг.

Создание проекта Nest.js

Чтобы создать проект Nest.js, на вашем устройстве должен быть установлен CLI. Если вы этого не сделаете, запустите эту команду, чтобы установить его:

npm install -g @nestjs/cli

Установив интерфейс командной строки Nest.js, запустите эту команду, чтобы создать новый проект Nest.js:

nest new

Вы можете заменить «» с любым именем по вашему выбору. Выполнение приведенной выше команды создаст новый проект Nest.js с указанным именем.

Текущая структура вашего проекта должна выглядеть так, как показано на рисунке ниже:

Чтобы попрактиковаться в внедрении службы из одного модуля в другой, вы создадите два модуля: модуль-a и модуль-b. Вы также создадите соответствующие файлы служб и контроллеров.

instagram viewer

Запустите эту команду, чтобы сгенерировать модуль-a:

nest generate modulemodule-a

И запустите эквивалентную команду для модуля-b:

nest generate modulemodule-b

Затем запустите эту команду, чтобы сгенерировать файлы службы и контроллера для модуля-a:

nest generate service module-a && nest generate controller module-a

И запустите эквивалентную команду для модуля-b:

nest generate service module-b && nest generate controller module-b

Ваш текущий каталог проекта должен выглядеть следующим образом: источник/модуль-а и источник/модуль-b каталоги:

Экспорт сервиса из модуля A

Чтобы экспортировать сервис модуля-а из модуля-а, вам необходимо указать его как экспорт в файле модуля модуля-а (модуль-a.module.ts). По умолчанию интерфейс командной строки Nest.js не предоставляет экспорт массив в @Модуль декоратор, поэтому сгенерированный файл модуля будет выглядеть так:

// module-a.module.ts
import { Module } from'@nestjs/common';
import { ModuleAService } from'./module-a.service';
import { ModuleAController } from'./module-a.controller';

@Module({
providers: [ModuleAService],
controllers: [ModuleAController],
})

exportclassModuleAModule{}

Чтобы сделать сервис-а(модуль-a.service.ts), доступный модулям, которые импортируют модуль-a, создайте экспорт массив в @Модуль декоратор и добавить МодульAService к этому.

Вот так:

import { Module } from'@nestjs/common';
import { ModuleAService } from'./module-a.service';
import { ModuleAController } from'./module-a.controller';

@Module({
providers: [ModuleAService],
controllers: [ModuleAController],
exports: [ModuleAService],
})

exportclassModuleAModule{}

Далее, в целях тестирования, добавьте в ваш модуль простую функцию — служебный файл (модуль-a.service.ts):

import { Injectable } from'@nestjs/common';

@Injectable()
exportclassModuleAService{
getHello(): string {
return'Hello from Module A!';
}
}

Эта функция возвращает образец строки. Чтобы убедиться, что вы можете правильно импортировать эту службу, вы вызовете эту функцию из модуля-b после внедрения службы-а.

Импорт сервиса в модуль B

Чтобы импортировать один модуль в другой, вам необходимо указать его как импортируемый в импорт массив принимающего модуля. В этом случае вам необходимо добавить модуль-a в импорт массив модулей-b @Модуль декоратор.

Как и раньше, интерфейс командной строки Nest.js не генерирует автоматически импорт массив, поэтому вам придется добавить его вручную.

Сначала импортируйте родительский модуль (модуль-a.module.ts) в приемный модуль (модуль-b.module.ts), создайте импорт массив и добавьте МодульAМодуль в массив:

// module-b.module.ts
import { Module } from'@nestjs/common';
import { ModuleBController } from'./module-b.controller';
import { ModuleBService } from'./module-b.service';
import { ModuleAModule } from'../module-a/module-a.module';

@Module({
imports: [ModuleAModule],
controllers: [ModuleBController],
providers: [ModuleBService],
})

exportclassModuleBModule{}

Далее откройте свой модуль-b.service.ts файл и импортируйте Вводить декоратор и МодульASService от @nests/common и ../модуль-а/модуль-а.сервис, соответственно:

import { Injectable, Inject } from'@nestjs/common';
import { ModuleAService } from'../module-a/module-a.service';

Вводить декоратор помечает свой параметр как цель для внедрения зависимостей.

Далее в вашем МодульBService class, добавьте блок кода ниже:

@Inject(ModuleAService)
private readonly moduleAService: ModuleAService;

Приведенный выше блок кода предоставляет вашему ModuleBService доступ к методам, доступным в вашем ModuleAService.

Вы можете протестировать службу, вызвав метод ModuleAService. получитьПривет метод.

// module-b.service.ts
import { Injectable, Inject } from'@nestjs/common';
import { ModuleAService } from'src/module-a/module-a.service';

@Injectable()
exportclassModuleBService{
@Inject(ModuleAService)
private readonly moduleAService: ModuleAService;

getHello(): string {
returnthis.moduleAService.getHello();
}
}

Далее откройте свой модуль-b.controller.ts файл и замените сгенерированный код блоком кода ниже:

// module-b.controller.ts
import { Controller, Get } from'@nestjs/common';
import { ModuleBService } from'./module-b.service';

@Controller('module-b')
exportclassModuleBController{
constructor(private readonly moduleBService: ModuleBService) {}

@Get('/hello')
getHello(): string {
returnthis.moduleBService.getHello();
}
}

Блок кода выше устанавливает ПОЛУЧАТЬ обработчик маршрута для получитьПривет функция.

Окончательно, сделать запрос GET с помощью Curl на локальный хост: 3000/module-b/hello. Команда должна вывести «Привет из модуля А!» на вашу консоль.

Вы успешно внедрили службу в другой модуль. Это может пригодиться, когда вы создание API с помощью Nest.js которые имеют несколько модулей, которым необходимо вызывать методы друг друга.

Преимущества межмодульного внедрения

Хотя прямой вызов службы из другого модуля на первый взгляд может показаться более простым, в долгосрочной перспективе это может привести к созданию более сложной, менее поддерживаемой и менее масштабируемой системы.

Однако межмодульное внедрение способствует модульности кода и возможности повторного использования, что упрощает его обслуживание. Кроме того, он централизует зависимости, улучшает тестируемость и поддерживает масштабируемую, несвязанную архитектуру.