Ana içeriğe geç

NestJS Dependency Injection Rehberi

Bu rehberde ne öğreneceksiniz?

Bu rehberde NestJS Dependency Injection (DI) mimarisinin nasıl çalıştığını öğreneceksiniz.
DI ve IoC kavramlarını sade örneklerle anlayacak, NestJS’in neden bu yapıyı merkeze aldığını göreceksiniz.


🧠 Teknik Özet

Bu rehber, NestJS’te Dependency Injection kullanımını anlatır.
Amaç, sınıflar arası sıkı bağımlılığı azaltmak ve sürdürülebilir bir mimari kurmaktır.
Adımlar: JavaScript sınıfları → DI ihtiyacı → NestJS DI sistemi → Modül, servis ve controller ilişkisi.


Ön Gereksinimler

Devam etmeden önce aşağıdakiler hazır olmalıdır:

  • Node.js (v16 ve üzeri)
  • VS Code veya benzeri bir editör
  • Postman veya benzeri API test aracı
  • NestJS temel kavramları (Module, Controller, Provider)

JavaScript Sınıflarına Kısa Bir Bakış

JavaScript’te sınıflar, nesne üretmek için kullanılan şablonlardır.

class Greeting {
sayGoodMorning() {
return "Hello, Good Morning";
}
}

const message = new Greeting().sayGoodMorning();
console.log(message);
  • Bu kod, bir sınıftan nesne oluşturmayı gösterir.

Constructor Kullanımı


class Greeting {
constructor(message) {
this.message = message;
}

sayGoodMorning() {
return this.message;
}
}

const greeting = new Greeting("Hello, Good Morning").sayGoodMorning();
console.log(greeting);
  • Bu yapı, sınıfa dışarıdan veri vermeyi sağlar.

DI Olmadan Bir Servis Tasarımı

  • Aşağıdaki örnekte servisler birbirine sıkı bağlıdır.

class DatabaseService {
createPost(post) {
return `Creating ${post.title}`;
}
}

class BlogService {
constructor() {
this.databaseService = new DatabaseService();
}

createPost(title, content) {
return this.databaseService.createPost({ title, content });
}
}
  • Bu yaklaşımın sorunları:
  1. Servisler değiştirilemez.

  2. Test yazmak zordur.

  3. Kod esnek değildir.


NestJS ile Dependency Injection

  1. NestJS’te sınıflar manuel oluşturulmaz.
  2. Framework, nesneleri sizin yerinize üretir.

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

@Injectable()
class DatabaseService {
getAllPosts() {
return [];
}
}

@Injectable()
class BlogService {
constructor(private databaseService: DatabaseService) {}

listPosts() {
return this.databaseService.getAllPosts();
}
}
  • Bu yapı, constructor injection kullanır.

Inversion of Control (IoC) Nedir?

  1. IoC, kontrolün uygulamadan alınıp framework’e verilmesidir.

  2. NestJS, nesnelerin yaşam döngüsünü kendisi yönetir.


Kazanımlar:

  1. Gevşek bağlı mimari

  2. Kolay test edilebilirlik

  3. Daha temiz kod


NestJS’te Dependency Injection Akışı

  1. Provider tanımlanır.

  2. Module içine eklenir.

  3. Controller veya servis içine enjekte edilir.

  4. NestJS IoC container nesneyi yönetir.


NestJS Projesi Oluşturma


npm i -g @nestjs/cli
nest new nest-di
cd nest-di
  • Bu komutlar, yeni bir NestJS projesi oluşturur.

Resource Oluşturma


nest g resource players

Bu komut:

  1. players.module

  2. players.service

  3. players.controller

  4. dosyalarını oluşturur.


  • PlayersService

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

@Injectable()
export class PlayersService {
private players = [
{ id: 1, name: 'Lionel Messi' },
{ id: 2, name: 'Cristiano Ronaldo' },
];

getPlayers() {
return this.players;
}
}
  • Bu servis, oyuncu listesini döndürür.

  • PlayersController

import { Controller, Get } from '@nestjs/common';
import { PlayersService } from './players.service';

@Controller('players')
export class PlayersController {
constructor(private readonly playersService: PlayersService) {}

@Get()
getPlayers() {
return this.playersService.getPlayers();
}
}
  • Controller, servisi DI ile alır.

  • PlayersModule

import { Module } from '@nestjs/common';
import { PlayersService } from './players.service';
import { PlayersController } from './players.controller';

@Module({
controllers: [PlayersController],
providers: [PlayersService],
})
export class PlayersModule {}
  • Module, provider ve controller ilişkisini tanımlar.

Uygulama Akışı

  1. İstek /players adresine gelir.

  2. Controller çalışır.

  3. Servis çağrılır.

  4. Veri döndürülür.

  5. Decorator Mantığı


  • Decorators, sınıflara metadata ekler.

function exampleDecorator(constructor: Function) {
console.log("Decorator çalıştı");
}

@exampleDecorator
class Example {}
  • Sınıf oluşturulmadan önce decorator çalışır.

Önemli NestJS Decorator’ları

1. Injectable() Bir sınıfın DI sistemi tarafından yönetileceğini belirtir.

2. @Module() Uygulama yapısını tanımlar.

3. @Controller() HTTP isteklerini karşılayan sınıfları belirtir.


Yaygın Hata: Provider Eksikliği


@Module({
controllers: [PlayersController],
providers: [],
})
export class PlayersModule {}

  • Bu yapı hata üretir. Çünkü PlayersService provider olarak eklenmemiştir.

Sıkça Sorulan Sorular

  1. DI neden önemlidir? Kodun test edilebilir ve sürdürülebilir olmasını sağlar.

  2. NestJS DI zorunlu mu? Evet, mimarinin temelidir.

  3. Provider nedir? Enjekte edilebilen sınıftır.

  4. Controller servis olmadan çalışır mı? Hayır, iş mantığı servislerde olmalıdır.

  5. IoC container nedir? Bağımlılıkları yöneten merkezi yapıdır.


Sonuç

Bu rehberde NestJS Dependency Injection mantığını detaylı şekilde öğrendiniz. DI ve IoC sayesinde daha modüler ve ölçeklenebilir uygulamalar geliştirebilirsiniz. Bu mimari, büyük NestJS projelerinin temelini oluşturur.

İsterseniz bu yapıyı Rabisu Bulut altyapısı üzerinde hemen test edebilirsiniz.