Dependency injection uitgelegd
Krijg inzicht in het concept Inversion of Control en in hoe NestJS dependency injection implementeert voor het beheren van afhankelijkheden tussen klassen.
Dependency injection uitgelegd is een gratis Enterprise-backend-API's met NestJS-les op CoddyKit. Dit is les 1 van 3. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Enterprise-backend-API's met NestJS. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Enterprise-backend-API's met NestJS bevat in totaal 3 lessen.
Wat zijn afhankelijkheden?
Bij programmeren is een afhankelijkheid simpelweg iets wat een klasse of functie nodig heeft om haar taak uit te voeren. Een klasse "Car" kan bijvoorbeeld afhankelijk zijn van een klasse "Engine" om te kunnen rijden.
Als je deze afhankelijkheden handmatig in elke klasse maakt, kan dat leiden tot sterk gekoppelde code. Daardoor wordt je code moeilijker te testen, te wijzigen en opnieuw te gebruiken.
Dependency injection (DI) helpt je deze relaties beter te beheren, waardoor je applicaties flexibeler worden.
Inversion of Control begrijpen
Inversion of Control (IoC) is een ontwerpprincipe waarbij de besturingsstroom wordt omgekeerd. In plaats van dat je code een bibliotheek aanroept, roept een framework jouw code aan en beheert het het maken en de levensduur van objecten.
- Traditioneel: je gaat de keuken in en kookt je eigen maaltijd (je code maakt de afhankelijkheden).
- IoC: je bestelt van een menu en de chef bereidt en serveert je maaltijd (het framework maakt de afhankelijkheden en stelt ze beschikbaar).
NestJS is gebouwd op IoC. Dat betekent dat het de verantwoordelijkheid neemt voor het maken en beheren van veel onderdelen van je applicatie.
Dependency injection gedefinieerd
Dependency injection (DI) is een specifiek patroon om Inversion of Control te implementeren. Het betekent dat afhankelijkheden in een onderdeel worden "geïnjecteerd", in plaats van dat het onderdeel ze zelf maakt.
In plaats van dat een klasse zegt: "Ik heb een Engine nodig, dus ik maak new Engine()", zegt deze: "Ik heb een Engine nodig, geef me er een."
Dit "geven" van afhankelijkheden gebeurt meestal via de constructor van de klasse, een setter-methode of property-injectie.
Waarom dependency injection gebruiken?
DI biedt verschillende belangrijke voordelen voor het bouwen van robuuste applicaties:
- Betere testbaarheid: verwissel tijdens tests eenvoudig echte afhankelijkheden voor nagebootste versies.
- Betere onderhoudbaarheid: wijzigingen aan een afhankelijkheid vereisen niet dat je elke klasse aanpast die deze gebruikt.
- Betere herbruikbaarheid: onderdelen worden algemener en kunnen in verschillende contexten worden gebruikt.
- Minder koppeling: klassen zijn niet rechtstreeks afhankelijk van concrete implementaties, waardoor systemen flexibeler worden.
NestJS-providers en @Injectable()
In NestJS wordt bijna alles wat geïnjecteerd kan worden een provider genoemd. Hieronder vallen services, repositories, factories, hulpprogramma's en meer.
De decorator @Injectable() markeert een klasse als provider. Daarmee laat je de NestJS-runtime weten dat deze klasse door de container voor dependency injection kan worden beheerd.
Wanneer NestJS @Injectable() ziet, weet het hoe het een exemplaar van die klasse moet maken en beschikbaar moet stellen aan andere onderdelen die dit nodig hebben.
Hoe NestJS afhankelijkheden injecteert
NestJS gebruikt voornamelijk injectie via de constructor. Dat betekent dat je de afhankelijkheden die een klasse nodig heeft rechtstreeks in de constructor declareert.
Door het type van de afhankelijkheid in de constructor op te geven, vindt de DI-container van NestJS automatisch een exemplaar van die afhankelijkheid en stelt dit beschikbaar wanneer je klasse wordt gemaakt.
Dit is een krachtige en overzichtelijke manier om afhankelijkheden te beheren zonder ze handmatig te instantiëren, en bevordert duidelijke relaties tussen onderdelen.
Voorbeeld: service-injectie
Stel dat je een AppService hebt die bedrijfslogica verwerkt en een AppController die HTTP-aanvragen verwerkt. De AppController heeft de AppService nodig om zijn taken uit te voeren.
Met DI maak je de service niet in de controller. In plaats daarvan declareer je deze in de constructor en stelt NestJS de service beschikbaar:
// app.service.ts
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
// app.controller.ts
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}Dit is een conceptueel fragment om de structuur te illustreren.
Uitvoerbare DI-simulatie
Bekijk een vereenvoudigd voorbeeld dat het kernidee van injectie via de constructor demonstreert. We simuleren het gedeelte met de "container" handmatig, zodat je de code kunt uitvoeren.
Let erop dat AppService niet zelf LoggerService maakt, maar deze ontvangt. Dat is de essentie van DI.
Probeer deze code uit te voeren:
class LoggerService {
log(message: string): void {
console.log(`[LOG]: ${message}`);
}
}
class AppService {
constructor(private readonly logger: LoggerService) {}
performTask(): void {
this.logger.log("AppService starting task...");
// Imagine some complex logic here
this.logger.log("AppService task completed!");
}
}
// --- Manual "DI Container" simulation ---
// In a real NestJS app, this is handled automatically
const loggerInstance = new LoggerService();
const appServiceInstance = new AppService(loggerInstance);
appServiceInstance.performTask();Providers in NestJS-modules
Om ervoor te zorgen dat NestJS je providers kent, moeten ze binnen een module worden geregistreerd. Modules zijn klassen met de decorator @Module().
De array providers binnen de decorator van een module vertelt NestJS welke klassen door de DI-container moeten worden beheerd.
Bijvoorbeeld:
@Module({
imports: [],
controllers: [AppController],
providers: [AppService, LoggerService], // Register your providers here!
})
export class AppModule {}Deze configuratie zorgt ervoor dat NestJS weet waar het AppService moet vinden en hoe het deze moet maken wanneer AppController AppService nodig heeft (en ook de afhankelijkheden ervan, zoals LoggerService).
Controleer je begrip
Herhaal de concepten dependency injection en NestJS-providers.
Samenvatting: DI en IoC in NestJS
Je hebt de fundamentele concepten achter de architectuur van NestJS geleerd:
- Inversion of Control (IoC): Het framework beheert het aanmaken en de levensduur van objecten.
- Dependency Injection (DI): Een patroon waarbij afhankelijkheden aan een klasse worden meegegeven, meestal via de constructor.
- Providers: NestJS-componenten (zoals services) die zijn gemarkeerd met
@Injectable()en kunnen worden geïnjecteerd. - Constructor Injection: De belangrijkste manier waarop NestJS afhankelijkheden beschikbaar maakt.
Inzicht in DI is cruciaal voor het bouwen van schaalbare en onderhoudbare NestJS-applicaties. In de volgende les verken je Data Transfer Objects (DTO's) en validatiepijplijnen!
Leer TypeScript met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 20
- Lessen
- 76
Veelgestelde vragen
Is de les “Dependency injection uitgelegd” gratis?
Ja — de volledige tekst van “Dependency injection uitgelegd” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Enterprise-backend-API's met NestJS wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Enterprise-backend-API's met NestJS bevat in totaal 3 lessen.
Wat leer ik in “Dependency injection uitgelegd”?
Krijg inzicht in het concept Inversion of Control en in hoe NestJS dependency injection implementeert voor het beheren van afhankelijkheden tussen klassen. Je oefent met Enterprise-backend-API's met NestJS door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Enterprise-backend-API's met NestJS te beginnen?
Ervaring vooraf is niet nodig. Enterprise-backend-API's met NestJS op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 3.
Hoe lang duurt de les “Dependency injection uitgelegd”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Enterprise-backend-API's met NestJS?
Ja. Elke les over Enterprise-backend-API's met NestJS bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Dependency injection uitgelegd
- DTO’s en validatiepipes
- Basisprincipes van TypeORM-integratie