Βεβαιωθείτε ότι οι μονάδες σας είναι καλά οργανωμένες με καθαρή, επαναχρησιμοποιήσιμη έγχυση.

Η εισαγωγή μιας υπηρεσίας από μια διαφορετική λειτουργική μονάδα Nest.js περιλαμβάνει μερικά βήματα για να διασφαλιστεί η σωστή ένεση εξάρτησης και η σωστή οργάνωση της λειτουργικής μονάδας. Χρησιμοποιώντας δύο δείγματα ενοτήτων, μάθετε πώς λειτουργεί η διαδικασία εξαγωγής και εισαγωγής υπηρεσιών.

Δημιουργία έργου Nest.js

Για να δημιουργήσετε ένα έργο Nest.js, πρέπει να έχετε εγκατεστημένο το CLI στη συσκευή σας. Εάν δεν το κάνετε, εκτελέστε αυτήν την εντολή για να την εγκαταστήσετε:

npm install -g @nestjs/cli

Με εγκατεστημένο το Nest.js CLI, εκτελέστε αυτήν την εντολή για να δημιουργήσετε ένα νέο έργο Nest.js:

nest new

Μπορείτε να αντικαταστήσετε το "” με όποιο όνομα διαλέξετε. Η εκτέλεση της παραπάνω εντολής θα δημιουργήσει ένα νέο έργο Nest.js με το καθορισμένο όνομα.

Η τρέχουσα δομή του έργου σας θα πρέπει να μοιάζει με την παρακάτω εικόνα:

Για να εξασκηθείτε στην έγχυση μιας υπηρεσίας από μια ενότητα σε μια διαφορετική ενότητα, θα δημιουργήσετε δύο ενότητες, την ενότητα-a και την ενότητα-β. Θα δημιουργήσετε επίσης τα αντίστοιχα αρχεία υπηρεσίας και ελεγκτή.

Εκτελέστε αυτήν την εντολή για να δημιουργήσετε το module-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

Ο τρέχων κατάλογος του έργου σας θα πρέπει να μοιάζει με αυτό, με src/module-a και src/module-b καταλόγους:

Εξαγωγή υπηρεσίας από την ενότητα Α

Για να εξαγάγετε την υπηρεσία module-a από την ενότητα-a module, πρέπει να την καταχωρίσετε ως εξαγωγή στο αρχείο module-a's (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, δημιουργούν ένα εξαγωγές συστοιχία στο @Μονάδα μέτρησης διακοσμητής και προσθέστε ModuleASservice σε αυτό.

Όπως έτσι:

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!';
}
}

Αυτή η συνάρτηση επιστρέφει μια συμβολοσειρά δείγματος. Για να επιβεβαιώσετε ότι μπορείτε να εισαγάγετε σωστά αυτήν την υπηρεσία, θα καλέσετε αυτήν τη λειτουργία από την ενότητα-b μετά την έγχυση της υπηρεσίας-a.

Εισαγωγή υπηρεσίας στην ενότητα Β

Για να εισαγάγετε μια λειτουργική μονάδα σε μια άλλη, πρέπει να την καταχωρίσετε ως εισαγωγή στο εισαγωγές συστοιχία της μονάδας λήψης. Σε αυτήν την περίπτωση, πρέπει να προσθέσετε την ενότητα-a στο εισαγωγές συστοιχία module-b @Μονάδα μέτρησης διακοσμητής.

Όπως και πριν, το Nest.js CLI δεν δημιουργεί αυτόματα ένα εισαγωγές πίνακα, επομένως πρέπει να τον προσθέσετε χειροκίνητα.

Πρώτα, εισαγάγετε τη γονική μονάδα (module-a.module.ts) στη μονάδα λήψης (module-b.module.ts), δημιουργήστε το εισαγωγές πίνακα και προσθέστε ModuleAMmodule στον πίνακα:

// 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{}

Στη συνέχεια, ανοίξτε το module-b.service.ts αρχείο και εισαγωγή του Κάνω ένεση διακοσμητής και ModuleASservice από @φωλιές/κοινό και ../module-a/module-a.service, αντίστοιχα:

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

ο Κάνω ένεση Ο διακοσμητής επισημαίνει την παράμετρό του ως στόχο για έγχυση εξάρτησης.

Στη συνέχεια, στο δικό σας ModuleBService τάξη, προσθέστε το μπλοκ κώδικα παρακάτω:

@Inject(ModuleAService)
private readonly moduleAService: ModuleAService;

Το παραπάνω μπλοκ κώδικα παρέχει στο ModuleBService πρόσβαση στις μεθόδους που είναι διαθέσιμες στο ModuleAService σας.

Μπορείτε να δοκιμάσετε την υπηρεσία καλώντας το ModuleAService's γεια σου μέθοδος.

// 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();
}
}

Στη συνέχεια, ανοίξτε το module-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 με μπούκλα προς localhost: 3000/module-b/hello. Η εντολή θα πρέπει να εκτυπώσει "Hello from Module A!" στην κονσόλα σας.

Έχετε εισαγάγει με επιτυχία μια υπηρεσία σε άλλη μονάδα. Αυτό μπορεί να σας φανεί χρήσιμο όταν είστε δημιουργία API με το Nest.js που έχουν πολλαπλές ενότητες που πρέπει να καλούν η μία τις μεθόδους της άλλης.

Οφέλη από την έγχυση πολλαπλών μονάδων

Ενώ η απευθείας κλήση μιας υπηρεσίας από άλλη μονάδα μπορεί να φαίνεται πιο απλή στην αρχή, μπορεί να οδηγήσει σε ένα πιο περίπλοκο, λιγότερο διατηρήσιμο και λιγότερο επεκτάσιμο σύστημα μακροπρόθεσμα.

Ωστόσο, η έγχυση πολλαπλών μονάδων προωθεί την αρθρωτή και επαναχρησιμοποίηση κώδικα, καθιστώντας ευκολότερη τη διατήρησή του. Επιπλέον, συγκεντρώνει τις εξαρτήσεις, βελτιώνει τη δυνατότητα δοκιμής και υποστηρίζει μια κλιμακούμενη, αποσυνδεδεμένη αρχιτεκτονική.