15.07.2024

NestJS: Modüller

 

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ı

Yukarıda basit bir modül şeması görselleştirmeye çalıştım. Bu şemada yer alan Notification modülünün NotificationService adında bir provider'ı olsun. UserAccount Modülü içerisindeki bir sınıfta NotificationService provider'ını kullanabilmek için:
  • 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 {}

Bir Nest uygulamasının dosya yapısı içinde, aynı modüle ait dosyaların modülün adı ile isimlendirilmiş bir klasör içinde yer alması tavsiye ediliyor. Ayrıca ben projelerimde modül klasörlerini tüm modüllerin yer aldığı bir 'modules' klasöründe tutmayı tercih ediyorum.

Nest modülleri birer singleton, ve bütün modüller oluşturuldukları anda diğer modüller tarafından kullanılabilir hale geliyor. Bir modül tarafından export edilen herhangi bir provider, kolayca diğer modiller tarafından ilgili modül import edilerek kullanılabiliyor.

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