En guide om beroendeinjektion i NestJS

By rik


En djupdykning i beroendeinjektion inom NestJS

Introduktion

NestJS, ett ramverk för Node.js baserat på TypeScript, möjliggör konstruktion av skalbara och testbara serverapplikationer. En kärnkomponent i NestJS arkitektur är beroendeinjektion (DI), ett designmönster som främjar modulär kod, förbättrad testbarhet och förenklat underhåll. DI separerar komponenternas skapande och beroenden, vilket resulterar i system med ökad flexibilitet och enklare underhåll.

NestJS använder dekoratörer för att implementera DI. Dessa dekoratörer gör det möjligt för utvecklare att explicit definiera och injicera beroenden i klasser och metoder. Denna metod underlättar skapandet av mer anpassningsbara och robusta applikationer som är lätta att testa.

Vad innebär beroendeinjektion?

Beroendeinjektion (DI) är en metod för att hantera relationerna mellan olika delar av en applikation. Istället för att komponenter skapar sina beroenden själva, överförs dessa beroenden externt genom en ”injektor”.

DI medför flera betydande fördelar:

  • Förbättrad modularitet: DI uppmuntrar till att dela upp systemet i modulära enheter, vilket förenklar underhåll och testning.
  • Ökad testbarhet: Mock-objekt kan enkelt användas för att simulera beroenden, vilket möjliggör mer omfattande och effektivare tester.
  • Förbättrad flexibilitet: Beroenden kan bytas ut utan att påverka andra delar av applikationen, vilket ökar dess anpassningsbarhet.

Beroendeinjektion i NestJS – hur fungerar det?

NestJS använder dekoratörer från paketet @nestjs/common för att hantera DI. Dessa dekoratörer används för att injicera beroenden i klasser, metoder, argument och leverantörer.

Injektion av beroenden i klasser

Genom att använda @Inject() kan du injicera ett beroende i en klass. Dekoratorn specificerar vilken typ av beroende som ska injiceras, och en instans av beroendet kommer att tillhandahållas i klasskonstruktorn.


import { Inject } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';

class AppService {
constructor(@Inject(ConfigService) private configService: ConfigService) {}
}

Injektion av beroenden i metoder

Beroenden kan också injiceras i metoder genom att använda @Inject()-dekoratorn på metodens parameter. När metoden anropas kommer en instans av beroendet att injiceras.


import { Inject } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';

class AppService {
constructor() {}

@Inject(ConfigService)
getConfigValue(value: string): string {
return this.configService.get<string>(value);
}
}

Injektion av beroenden i argument

@Inject()-dekoratorn kan också användas för att injicera beroenden i argument till konstruktorer och metoder. Dekoratorn placeras på argumentparametern och injicerar en instans av beroendet vid anrop.


import { Inject } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';

const appModule: NestModule = {
providers: [
{
provide: 'CONFIG_VALUE',
useValue: 'nestjs-di',
},
],
controllers: [AppController],
};

class AppController {
constructor(
@Inject('CONFIG_VALUE') private configValue: string,
@Inject(ConfigService) private configService: ConfigService,
) {}
}

Tillhandahållande av beroenden

För att göra en klass injicerbar används @Injectable()-dekoratorn. Denna dekorator markerar klassen som en leverantör som kan injiceras i andra klasser.


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

@Injectable()
export class AppService {
constructor() {}
}

Fördelar med att använda DI i NestJS

Användningen av DI i NestJS erbjuder flera fördelar:

  • Ökad testbarhet: Genom att använda mock-objekt kan man effektivare testa isolerade delar av systemet.
  • Förbättrad kodmodulering: DI främjar modulär design vilket underlättar underhåll och testning.
  • Ökad flexibilitet: Möjligheten att enkelt byta ut beroenden ger ökad anpassningsbarhet.
  • Enklare underhåll: Beroenden hanteras på ett ordnat sätt, vilket förenklar systemets underhåll.

Sammanfattning

Beroendeinjektion är ett kraftfullt verktyg för att skapa välstrukturerade, testbara och flexibla NestJS-applikationer. Genom att använda DI kan utvecklare bygga mer anpassningsbara och lättunderhållna applikationer.

Vanliga Frågor (FAQ)

  1. Vad skiljer beroendeinjektion (DI) från service locator-mönstret?
    DI tillhandahåller beroenden när objekt skapas, medan service locator använder en central plats för att hämta beroenden.
  2. Vilka är fördelarna med DI i NestJS?
    Förbättrad testbarhet, modulär design, ökad flexibilitet och enklare underhåll.
  3. Hur injicerar man ett beroende i en klass i NestJS?
    Använd @Inject() dekoratorn i klassens konstruktor.
  4. Hur injicerar man ett beroende i en metod i NestJS?
    Använd @Inject() dekoratorn på metodparametern.
  5. Hur injicerar man ett beroende i ett argument i NestJS?
    Använd @Inject() dekoratorn på argumentet i metoden eller konstruktorn.
  6. Hur skapar man ett beroende i NestJS?
    Använd @Injectable() dekoratorn för att markera en klass som en leverantör av beroenden.
  7. Hur kopplar man bort ett beroende från en klass i NestJS?
    Använd @Optional() dekoratorn för att ange att beroendet är valfritt.
  8. Hur testar man beroendeinjektion i NestJS?
    Använd mock-objekt för att simulera beroenden under enhetstester.