Уверете се, че вашите модули са добре организирани с чисто инжектиране за многократна употреба.
Инжектирането на услуга от различен модул Nest.js включва няколко стъпки, за да се осигури правилно инжектиране на зависимости и организация на модула. Използвайки два примерни модула, научете как работи процесът на експортиране и импортиране на услуги.
Генериране на проект Nest.js
За да генерирате проект Nest.js, трябва да имате инсталиран CLI на вашето устройство. Ако не го направите, изпълнете тази команда, за да го инсталирате:
npm install -g @nestjs/cli
С инсталиран Nest.js CLI, изпълнете тази команда, за да генерирате нов Nest.js проект:
nest new
Можете да замените „
Вашата текуща структура на проекта трябва да изглежда като изображението по-долу:
За да практикувате инжектиране на услуга от един модул в друг модул, ще генерирате два модула, module-a и module-b. Освен това ще генерирате съответните им файлове за услуга и контролер.
Изпълнете тази команда, за да генерирате modul-a:
nest generate modulemodule-a
И изпълнете еквивалентната команда за module-b:
nest generate modulemodule-b
След това изпълнете тази команда, за да генерирате файловете на услугата и контролера за module-a:
nest generate service module-a && nest generate controller module-a
И изпълнете еквивалентната команда за module-b:
nest generate service module-b && nest generate controller module-b
Вашата текуща директория на проекта трябва да изглежда така, с src/module-a и src/module-b директории:
Експортиране на услуга от модул A
За да експортирате услугата module-a от модула module-a, трябва да я посочите като експорт в модулния файл на module-a (module-a.module.ts). По подразбиране Nest.js CLI не предоставя износ масив в @Модул декоратор, така че генерираният модулен файл ще изглежда така:
// 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{}
За извършване на услугата (module-a.service.ts) достъпни за модули, които импортират module-a, създават an износ масив в @Модул декоратор и доп ModuleAService към него.
Така:
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{}
След това, за целите на тестването, добавете проста функция към вашия модул - сервизен файл (module-a.service.ts):
import { Injectable } from'@nestjs/common';
@Injectable()
exportclassModuleAService{
getHello(): string {
return'Hello from Module A!';
}
}
Тази функция връща примерен низ. За да потвърдите, че можете да импортирате тази услуга правилно, ще извикате тази функция от module-b след инжектиране на service-a.
Импортиране на услуга в модул B
За да импортирате един модул в друг, трябва да го посочите като импортиран в внос масив на приемния модул. В този случай трябва да добавите module-a към внос масив от module-b @Модул декоратор.
Както и преди, Nest.js CLI не генерира автоматично внос масив, така че трябва ръчно да го добавите.
Първо импортирайте родителския модул (module-a.module.ts) в приемащия модул (module-b.module.ts), създайте внос масив и добавете МодулАМодул към масива:
// 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 файл и импортирайте Инжектирайте декоратор и ModuleAServerice от @гнезда/общи и ../module-a/module-a.service, съответно:
import { Injectable, Inject } from'@nestjs/common';
import { ModuleAService } from'../module-a/module-a.service';
The Инжектирайте декораторът маркира своя параметър като цел за инжектиране на зависимост.
Следваща, във вашия ModuleBService клас, добавете кодовия блок по-долу:
@Inject(ModuleAService)
private readonly moduleAService: ModuleAService;
Кодовият блок по-горе дава на вашия ModuleBService достъп до методите, налични във вашия ModuleAService.
Можете да тествате услугата, като се обадите на ModuleAService getHello метод.
// 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();
}
}
Кодовият блок по-горе настройва a ВЗЕМЕТЕ манипулатор на маршрут за getHello функция.
накрая направете GET заявка с curl към localhost: 3000/модул-b/здравей. Командата трябва да отпечата „Здравейте от модул A!“ към вашата конзола.
Успешно сте инжектирали услуга в друг модул. Това може да бъде полезно, когато сте изграждане на API с Nest.js които имат множество модули, които трябва да извикват методите на другия.
Предимства на кръстосано модулно инжектиране
Докато директното извикване на услуга от друг модул може да изглежда по-просто в началото, това може да доведе до по-сложна, по-малко поддържаема и по-малко мащабируема система в дългосрочен план.
Въпреки това, инжектирането на кръстосани модули насърчава модулността на кода и повторната употреба, което го прави по-лесен за поддръжка. Освен това централизира зависимостите, подобрява възможността за тестване и поддържа мащабируема, отделена архитектура.