Bir NestJS modülü @Module() dekoratörü (decorator) ile işaretlenmiş bir sınıftır. Bu dekoratör ile Nest, uygulama yapısını organize etmek için kullanacağı metadata'ya erişim sağlamış olur.
Her NestJS uygulaması 'root module' ile başlar. Bu başlangıç noktasından hareketle diğer modüller arasındaki ilişkiler belirlenir. Uygulamamızın bileşenlerini organize etmek için modülleri kullanmak oldukça kullanışlı ancak çok küçük uygulamalar için sadece root modül de kullanılabilir. @Module() dekoratörünün parametre olarak aldığı objenin alanlarını (property) inceleyelim:
providers: Nest'in dependency injector'ı tarafından bu arraydeki sınıflardan birer obje ilklendirilerek modül içinde erişime açılır.
controllers: Modül içinde yer alan controller'lar bu array içinde yer almalıdır.
imports: Import edilecek olamn modüller bu array içinde yer alır.
exports: Diğer modüller tarafından kullanılacak provider'lar bu liste içinde export edilmelidir.
A modülü içinde, B modülü içinde yer alan bir provider'ın kullanılabilmesi için:
- B modülü A modülünün import array'inde yer almalı
- İlgili provider B modülünün hem providers hem de exports array'inde yer almalı
- NotificationService provider'ı NotificationModule sınıfının exports array'inde yer almalı
- Notification Modülü, User Account Modülünün imports array'inde yer almalı.
//notification.module.ts import { Module } from '@nestjs/common'; import { NotificationController } from './notification.controller'; import { NotificationService } from './notification.service'; @Module({ providers: [NotificationService], controllers: [NotificationController], exports: [NotificationService], }) export class NotificationModule {}
//user-account.module.ts import { Module } from '@nestjs/common'; import { UserAccountService } from './user-account.service'; import { UserAccountController } from './user-account.controller'; import { NotificationModule } from '../notification/notification.module'; @Module({ imports: [NotificationModule], providers: [UserAccountService], controllers: [UserAccountController], exports: [UserAccountService], }) export class UserAccountModule {}
//app.module.ts import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { UserAccountModule } from './modules/user-account/user-account.module'; import { NotificationModule } from './modules/notification/notification.module'; @Module({ imports: [UserAccountModule, NotificationModule], controllers: [AppController], providers: [AppService], }) export class AppModule {}
Modüller içlerinde yer alan provider'ları export edebildikleri gibi import ettikleri modülleri de yeniden export edebiliyorlar.
Çok fazla yerde import ettiğiniz bir modül varsa ve her modülde bu modülü tekrar tekrar import etmek sizi rahatsız ediyorsa @Global() dekoratörü imdadınıza yetişiyor. @Global() dekoratörü ile işaretlenmiş modüller tarafından export eidlen provider'lar, diğer modüller tarafından import edilmesine ihtiyaç duyulmadan kullanılabilir hale geliyor.
Nest'in modül sistemi, dinamik modüller oluşturulmasına da olanak sağlıyor. Bu dinamik modüller sayesinde provider'ları dinamik bir şekilde ayarlanabilen özelleştirilebilir modüller geliştirmek mümkün hale geliyor. Dİnamik modüllerle ilgili ayrı bir yazı yazmayı düşünüyorum ama siz bu arada NestJS dokümantasyonunun ilgili bölümünden daha fazla bilgi alabilirsiniz.
Kaynak:
https://docs.nestjs.com/modules