{"id":33170,"date":"2025-10-30T14:41:09","date_gmt":"2025-10-30T11:41:09","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33170"},"modified":"2025-10-30T14:41:09","modified_gmt":"2025-10-30T11:41:09","slug":"nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/","title":{"rendered":"NestJS&#8217;te Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>NestJS&#8217;te Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu: Kapsaml\u0131 Bir Rehber<\/h2>\n<h3>Giri\u015f: Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Yaz\u0131l\u0131m geli\u015ftirmede &#8220;ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu&#8221; (Dependency Injection &#8211; DI), bir bile\u015fenin ihtiya\u00e7 duydu\u011fu di\u011fer bile\u015fenleri (ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131) do\u011frudan olu\u015fturmak yerine, d\u0131\u015far\u0131dan almas\u0131n\u0131 sa\u011flayan g\u00fc\u00e7l\u00fc bir tasar\u0131m desenidir. Bu desen, &#8220;kontrol\u00fcn tersine \u00e7evrilmesi&#8221; (Inversion of Control &#8211; IoC) prensibinin \u00f6zel bir uygulamas\u0131d\u0131r. Geleneksel yakla\u015f\u0131mlarda, bir s\u0131n\u0131f kendi ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kendisi olu\u015fturur veya bulur. Bu durum, s\u0131n\u0131flar aras\u0131nda s\u0131k\u0131 bir ba\u011f (tight coupling) olu\u015fturur, bu da kodun test edilmesini, bak\u0131m\u0131n\u0131 ve geni\u015fletilmesini zorla\u015ft\u0131r\u0131r. Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu sayesinde, bir s\u0131n\u0131f\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131 d\u0131\u015far\u0131dan &#8220;enjekte&#8221; edilir, b\u00f6ylece s\u0131n\u0131f\u0131n kendi ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netme sorumlulu\u011fu ortadan kalkar.<\/p>\n<p>Peki, bu neden \u00f6nemlidir? Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu, yaz\u0131l\u0131m mimarisine bir dizi \u00f6nemli fayda sa\u011flar:<\/p>\n<p>*   <strong>Test Edilebilirlik:<\/strong> Ba\u011f\u0131ml\u0131l\u0131klar d\u0131\u015far\u0131dan sa\u011fland\u0131\u011f\u0131 i\u00e7in, testler s\u0131ras\u0131nda ger\u00e7ek ba\u011f\u0131ml\u0131l\u0131klar yerine sahte (mock) veya taklit (stub) nesneler enjekte edilebilir. Bu, birim testlerinin daha izole ve g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Mod\u00fclerlik ve Esneklik:<\/strong> Bile\u015fenler aras\u0131ndaki s\u0131k\u0131 ba\u011f\u0131ml\u0131l\u0131klar\u0131 azalt\u0131r. Bir ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n uygulanmas\u0131 de\u011fi\u015fti\u011finde, onu kullanan s\u0131n\u0131f\u0131n kodunda de\u011fi\u015fiklik yap\u0131lmas\u0131na gerek kalmaz, sadece enjeksiyon mekanizmas\u0131 g\u00fcncellenir.<br \/>\n*   <strong>Yeniden Kullan\u0131labilirlik:<\/strong> Daha az ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 olan veya ba\u011f\u0131ml\u0131l\u0131klar\u0131 kolayca de\u011fi\u015ftirilebilen bile\u015fenler, farkl\u0131 ba\u011flamlarda daha kolay yeniden kullan\u0131labilir.<br \/>\n*   <strong>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> Kodun anla\u015f\u0131lmas\u0131 ve bak\u0131m\u0131 kolayla\u015f\u0131r, \u00e7\u00fcnk\u00fc her s\u0131n\u0131f\u0131n neye ihtiyac\u0131 oldu\u011fu a\u00e7\u0131k\u00e7a belirtilir ve bu ihtiya\u00e7lar d\u0131\u015far\u0131dan kar\u015f\u0131lan\u0131r.<br \/>\n*   <strong>\u00d6l\u00e7eklenebilirlik:<\/strong> B\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda ba\u011f\u0131ml\u0131l\u0131klar\u0131n merkezi olarak y\u00f6netilmesi, uygulaman\u0131n b\u00fcy\u00fcmesiyle birlikte kar\u015f\u0131la\u015f\u0131labilecek karma\u015f\u0131kl\u0131\u011f\u0131 azalt\u0131r.<\/p>\n<p>NestJS, modern, \u00f6l\u00e7eklenebilir ve kurumsal d\u00fczeyde uygulamalar olu\u015fturmak i\u00e7in tasarlanm\u0131\u015f progresif bir Node.js \u00e7at\u0131s\u0131d\u0131r. TypeScript&#8217;i tamamen destekler ve mod\u00fcler, iyi organize edilmi\u015f kod yazmay\u0131 te\u015fvik eder. NestJS&#8217;in temelinde yatan en \u00f6nemli prensiplerden biri de g\u00fc\u00e7l\u00fc ve entegre ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu sistemidir. NestJS, Angular&#8217;dan esinlenerek, uygulaman\u0131z\u0131n bile\u015fenlerini y\u00f6netmek ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 otomatik olarak \u00e7\u00f6zmek i\u00e7in kendi IoC konteynerini kullan\u0131r. Bu makalede, NestJS&#8217;teki ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu mekanizmas\u0131n\u0131 derinlemesine inceleyece\u011fiz, temel kavramlardan ileri d\u00fczey konulara kadar her y\u00f6n\u00fcn\u00fc ele alaca\u011f\u0131z.<\/p>\n<h3>NestJS&#8217;te Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonunun Temelleri<\/h3>\n<p>NestJS&#8217;in ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu sistemi, uygulaman\u0131z\u0131n yap\u0131 ta\u015flar\u0131n\u0131, yani &#8220;sa\u011flay\u0131c\u0131lar\u0131&#8221; (providers) ve &#8220;t\u00fcketicileri&#8221; (consumers) tan\u0131mlaman\u0131za olanak tan\u0131r.<\/p>\n<h4>Sa\u011flay\u0131c\u0131lar (Providers)<\/h4>\n<p>Sa\u011flay\u0131c\u0131lar, NestJS IoC konteyneri taraf\u0131ndan y\u00f6netilen herhangi bir s\u0131n\u0131f veya de\u011ferdir. Genellikle servisler, depolar, fabrika fonksiyonlar\u0131 veya yap\u0131land\u0131rma nesneleri gibi i\u015f mant\u0131\u011f\u0131n\u0131 veya veri eri\u015fimini kaps\u00fclleyen bile\u015fenlerdir. NestJS&#8217;te bir s\u0131n\u0131f\u0131 sa\u011flay\u0131c\u0131 olarak i\u015faretlemenin en yayg\u0131n yolu <code>@Injectable()<\/code> dekorat\u00f6r\u00fcn\u00fc kullanmakt\u0131r.<\/p>\n<p>Bir servis s\u0131n\u0131f\u0131 d\u00fc\u015f\u00fcnelim:<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\nimport { Injectable } from '@nestjs\/common';\n\n@Injectable()\nclass UserService {\n  getUsers(): string[] {\n    return ['Alice', 'Bob'];\n  }\n}<\/code><\/pre>\n<p><code>@Injectable()<\/code> dekorat\u00f6r\u00fc, NestJS&#8217;e <code>UserService<\/code> s\u0131n\u0131f\u0131n\u0131n enjekte edilebilir bir sa\u011flay\u0131c\u0131 oldu\u011funu ve IoC konteyneri taraf\u0131ndan y\u00f6netilmesi gerekti\u011fini bildirir. Bu sayede, NestJS bu s\u0131n\u0131f\u0131n bir \u00f6rne\u011fini olu\u015fturabilir ve ihtiya\u00e7 duyan di\u011fer bile\u015fenlere enjekte edebilir.<\/p>\n<p>Sa\u011flay\u0131c\u0131lar, NestJS mod\u00fcllerinin <code>providers<\/code> dizisinde kaydedilir. Bir mod\u00fcl, uygulaman\u0131n bir alt k\u00fcmesini organize eden bir yap\u0131d\u0131r ve sa\u011flay\u0131c\u0131lar\u0131, denetleyicileri ve di\u011fer mod\u00fclleri bir araya getirir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\nimport { Module } from '@nestjs\/common';\nimport { UserService } from '.\/user.service';\nimport { UserController } from '.\/user.controller';\n\n@Module({\n  providers: [UserService],\n  controllers: [UserController],\n})\nclass UserModule {}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>UserService<\/code> <code>UserModule<\/code> i\u00e7inde bir sa\u011flay\u0131c\u0131 olarak kaydedilmi\u015ftir. Art\u0131k <code>UserModule<\/code> kapsam\u0131ndaki herhangi bir denetleyici veya ba\u015fka bir sa\u011flay\u0131c\u0131, <code>UserService<\/code>&#8216;i bir ba\u011f\u0131ml\u0131l\u0131k olarak isteyebilir.<\/p>\n<h4>T\u00fcketiciler (Consumers)<\/h4>\n<p>T\u00fcketiciler, sa\u011flay\u0131c\u0131lardan enjekte edilen ba\u011f\u0131ml\u0131l\u0131klar\u0131 kullanan s\u0131n\u0131flard\u0131r. NestJS&#8217;te ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunun birincil y\u00f6ntemi &#8220;kurucu enjeksiyonu&#8221; (constructor injection) olarak adland\u0131r\u0131l\u0131r. Bir s\u0131n\u0131f, ihtiya\u00e7 duydu\u011fu ba\u011f\u0131ml\u0131l\u0131klar\u0131 kurucusunun parametreleri olarak bildirir. NestJS IoC konteyneri, bu parametrelerin t\u00fcrlerini analiz eder ve uygun sa\u011flay\u0131c\u0131 \u00f6rneklerini otomatik olarak sa\u011flar.<\/p>\n<p>Bir denetleyici s\u0131n\u0131f\u0131 d\u00fc\u015f\u00fcnelim:<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\nimport { Controller, Get } from '@nestjs\/common';\nimport { UserService } from '.\/user.service';\n\n@Controller('users')\nclass UserController {\n  constructor(private readonly userService: UserService) {}\n\n  @Get()\n  getAllUsers(): string[] {\n    return this.userService.getUsers();\n  }\n}<\/code><\/pre>\n<p>Burada, <code>UserController<\/code> s\u0131n\u0131f\u0131 <code>UserService<\/code>&#8216;i kurucusuna enjekte eder. NestJS, <code>UserController<\/code>&#8216;\u0131n bir \u00f6rne\u011fini olu\u015ftururken, \u00f6nce <code>UserService<\/code>&#8216;in bir \u00f6rne\u011fini bulur veya olu\u015fturur ve ard\u0131ndan bu \u00f6rne\u011fi <code>UserController<\/code>&#8216;\u0131n kurucusuna ge\u00e7irir. <code>private readonly<\/code> anahtar kelimeleri, TypeScript&#8217;in k\u0131sayol s\u00f6z dizimidir ve enjekte edilen <code>userService<\/code>&#8216;i s\u0131n\u0131f i\u00e7inde eri\u015filebilir bir \u00f6zellik olarak tan\u0131mlar.<\/p>\n<h3>NestJS&#8217;te Sa\u011flay\u0131c\u0131 T\u00fcrleri ve Kapsamlar\u0131<\/h3>\n<p>NestJS, farkl\u0131 senaryolar\u0131 kar\u015f\u0131lamak i\u00e7in \u00e7e\u015fitli sa\u011flay\u0131c\u0131 t\u00fcrleri ve kapsamlar\u0131 sunar.<\/p>\n<h4>Standart Sa\u011flay\u0131c\u0131lar (S\u0131n\u0131f Bazl\u0131 Sa\u011flay\u0131c\u0131lar)<\/h4>\n<p>Yukar\u0131da g\u00f6rd\u00fc\u011f\u00fcm\u00fcz <code>@Injectable()<\/code> ile i\u015faretlenmi\u015f ve do\u011frudan bir mod\u00fcl\u00fcn <code>providers<\/code> dizisine eklenen s\u0131n\u0131flar, standart s\u0131n\u0131f bazl\u0131 sa\u011flay\u0131c\u0131lard\u0131r. NestJS, bu s\u0131n\u0131flar\u0131n tek bir \u00f6rne\u011fini (singleton) olu\u015fturur ve uygulaman\u0131n \u00f6mr\u00fc boyunca bu \u00f6rne\u011fi yeniden kullan\u0131r. Bu, varsay\u0131lan ve en yayg\u0131n kullan\u0131m \u015feklidir.<\/p>\n<h4>\u00d6zel Sa\u011flay\u0131c\u0131lar (Custom Providers)<\/h4>\n<p>Bazen, basit bir s\u0131n\u0131f \u00f6rne\u011fi yerine daha karma\u015f\u0131k bir ba\u011f\u0131ml\u0131l\u0131k sa\u011flaman\u0131z gerekebilir. NestJS, bu t\u00fcr durumlar i\u00e7in \u00f6zel sa\u011flay\u0131c\u0131lar tan\u0131mlaman\u0131za olanak tan\u0131r. \u00d6zel sa\u011flay\u0131c\u0131lar, bir &#8220;enjeksiyon token\u0131&#8221; (injection token) ve bir &#8220;sa\u011flay\u0131c\u0131 yap\u0131land\u0131rma nesnesi&#8221; (provider configuration object) kullan\u0131larak tan\u0131mlan\u0131r.<\/p>\n<p>Enjeksiyon token\u0131, NestJS&#8217;in hangi ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 enjekte edece\u011fini belirlemesini sa\u011flayan bir anahtard\u0131r. Genellikle do\u011frudan s\u0131n\u0131f ad\u0131n\u0131n kendisi kullan\u0131l\u0131r, ancak bazen stringler veya semboller de kullan\u0131labilir.<\/p>\n<p>\u00d6zel sa\u011flay\u0131c\u0131lar i\u00e7in d\u00f6rt ana strateji vard\u0131r:<\/p>\n<p>1.  <strong><code>useValue<\/code>:<\/strong> Sabit bir de\u011feri veya \u00f6nceden olu\u015fturulmu\u015f bir nesneyi enjekte etmek istedi\u011finizde kullan\u0131\u015fl\u0131d\u0131r. Bu de\u011fer, uygulaman\u0131n \u00f6mr\u00fc boyunca ayn\u0131 kal\u0131r.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\n    import { Module } from '@nestjs\/common';\n\n    const config = {\n      apiKey: 'my-secret-key',\n      apiUrl: 'https:\/\/api.example.com',\n    };\n\n    @Module({\n      providers: [\n        {\n          provide: 'APP_CONFIG', \/\/ Enjeksiyon token\u0131\n          useValue: config,     \/\/ Sa\u011flanacak de\u011fer\n        },\n      ],\n    })\n    class AppModule {}<\/code><\/pre>\n<p>    Bu yap\u0131land\u0131rmay\u0131 kullanmak i\u00e7in, <code>@Inject()<\/code> dekorat\u00f6r\u00fc ile \u00f6zel token\u0131 belirtmeniz gerekir:<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\n    import { Injectable, Inject } from '@nestjs\/common';\n\n    @Injectable()\n    class MyService {\n      constructor(@Inject('APP_CONFIG') private readonly appConfig: any) {\n        console.log(appConfig.apiKey);\n      }\n    }<\/code><\/pre>\n<p>2.  <strong><code>useClass<\/code>:<\/strong> Bir aray\u00fcz\u00fc veya soyut bir s\u0131n\u0131f\u0131 uygulayan farkl\u0131 bir s\u0131n\u0131f\u0131 enjekte etmek istedi\u011finizde kullan\u0131l\u0131r. Bu, uygulaman\u0131z\u0131n farkl\u0131 ortamlarda (\u00f6rne\u011fin, geli\u015ftirme ve \u00fcretim) farkl\u0131 uygulamalar kullanmas\u0131n\u0131 sa\u011flamak i\u00e7in harikad\u0131r.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\n    import { Module, Injectable } from '@nestjs\/common';\n\n    interface ILogger {\n      log(message: string): void;\n    }\n\n    @Injectable()\n    class ConsoleLogger implements ILogger {\n      log(message: string) {\n        console.log(<code>[Console] ${message}<\/code>);\n      }\n    }\n\n    @Injectable()\n    class FileLogger implements ILogger {\n      log(message: string) {\n        \/\/ Dosyaya log yazma mant\u0131\u011f\u0131\n        console.log(<code>[File] ${message}<\/code>);\n      }\n    }\n\n    @Module({\n      providers: [\n        {\n          provide: ILogger,        \/\/ Enjeksiyon token\u0131 (aray\u00fcz\/soyut s\u0131n\u0131f)\n          useClass: ConsoleLogger, \/\/ Sa\u011flanacak s\u0131n\u0131f\n        },\n      ],\n    })\n    class AppModule {}<\/code><\/pre>\n<p>    Burada, <code>ILogger<\/code> aray\u00fcz\u00fcn\u00fc isteyen herkes <code>ConsoleLogger<\/code>&#8216;\u0131n bir \u00f6rne\u011fini alacakt\u0131r.<\/p>\n<p>3.  <strong><code>useFactory<\/code>:<\/strong> Ba\u011f\u0131ml\u0131l\u0131klar\u0131n dinamik olarak olu\u015fturulmas\u0131 gerekti\u011finde veya ba\u011f\u0131ml\u0131l\u0131klar\u0131n olu\u015fturulmas\u0131 i\u00e7in karma\u015f\u0131k bir mant\u0131k gerekti\u011finde kullan\u0131l\u0131r. Fabrika fonksiyonlar\u0131, di\u011fer sa\u011flay\u0131c\u0131lara eri\u015febilir ve asenkron i\u015flemler de ger\u00e7ekle\u015ftirebilir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\n    import { Module, Injectable } from '@nestjs\/common';\n\n    @Injectable()\n    class DatabaseConfigService {\n      getConnectionString(): string {\n        return 'mongodb:\/\/localhost:27017\/mydb';\n      }\n    }\n\n    @Module({\n      providers: [\n        DatabaseConfigService,\n        {\n          provide: 'DATABASE_CONNECTION',\n          useFactory: (configService: DatabaseConfigService) => {\n            const connectionString = configService.getConnectionString();\n            \/\/ Veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 olu\u015fturma mant\u0131\u011f\u0131\n            return { connection: 'Connected to ' + connectionString };\n          },\n          inject: [DatabaseConfigService], \/\/ Fabrika fonksiyonunun ba\u011f\u0131ml\u0131l\u0131klar\u0131\n        },\n      ],\n    })\n    class AppModule {}<\/code><\/pre>\n<p>    <code>inject<\/code> dizisi, <code>useFactory<\/code> fonksiyonuna ba\u011f\u0131ml\u0131l\u0131k olarak ge\u00e7irilecek sa\u011flay\u0131c\u0131lar\u0131 belirtir.<\/p>\n<p>4.  <strong><code>alias<\/code> (Takma Adlar):<\/strong> Bir sa\u011flay\u0131c\u0131y\u0131 farkl\u0131 bir enjeksiyon token\u0131 alt\u0131nda eri\u015filebilir k\u0131lmak istedi\u011finizde kullan\u0131l\u0131r. Bu, \u00f6zellikle eski kodlarla uyumluluk sa\u011flamak veya kodun yeniden d\u00fczenlenmesi s\u0131ras\u0131nda faydal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\n    import { Module, Injectable } from '@nestjs\/common';\n\n    @Injectable()\n    class RealService {\n      getData(): string { return 'Real data'; }\n    }\n\n    @Module({\n      providers: [\n        RealService,\n        {\n          provide: 'LEGACY_SERVICE',\n          useExisting: RealService, \/\/ RealService'in mevcut \u00f6rne\u011fini kullan\n        },\n      ],\n    })\n    class AppModule {}<\/code><\/pre>\n<p>    Art\u0131k hem <code>RealService<\/code> hem de <code>'LEGACY_SERVICE'<\/code> token\u0131 kullan\u0131larak ayn\u0131 <code>RealService<\/code> \u00f6rne\u011fi enjekte edilebilir.<\/p>\n<h4>Kapsam (Scope)<\/h4>\n<p>NestJS sa\u011flay\u0131c\u0131lar\u0131 varsay\u0131lan olarak &#8220;singleton&#8221; kapsam\u0131ndad\u0131r. Bu, uygulaman\u0131n \u00f6mr\u00fc boyunca her sa\u011flay\u0131c\u0131n\u0131n yaln\u0131zca bir \u00f6rne\u011finin olu\u015fturuldu\u011fu ve t\u00fcm t\u00fcketicilerin ayn\u0131 \u00f6rne\u011fi payla\u015ft\u0131\u011f\u0131 anlam\u0131na gelir. Ancak, NestJS \u00fc\u00e7 farkl\u0131 kapsam sunar:<\/p>\n<p>1.  <strong><code>DEFAULT<\/code> (Singleton):<\/strong> Varsay\u0131lan kapsamd\u0131r. Uygulama ba\u015flat\u0131ld\u0131\u011f\u0131nda bir kez olu\u015fturulur ve t\u00fcm isteklerde yeniden kullan\u0131l\u0131r.<br \/>\n2.  <strong><code>REQUEST<\/code>:<\/strong> Her gelen HTTP iste\u011fi i\u00e7in sa\u011flay\u0131c\u0131n\u0131n yeni bir \u00f6rne\u011fi olu\u015fturulur. \u0130stek sona erdi\u011finde, \u00f6rnek \u00e7\u00f6p toplay\u0131c\u0131 taraf\u0131ndan temizlenir. Bu, iste\u011fe \u00f6zg\u00fc verileri (\u00f6rne\u011fin, kimlik do\u011frulama bilgileri, i\u015flem ba\u011flamlar\u0131) y\u00f6netmek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\n    import { Injectable, Scope } from '@nestjs\/common';\n\n    @Injectable({ scope: Scope.REQUEST })\n    class RequestScopedService {\n      private requestId: number;\n\n      constructor() {\n        this.requestId = Math.random();\n        console.log(<code>RequestScopedService instance created: ${this.requestId}<\/code>);\n      }\n\n      getRequestId(): number {\n        return this.requestId;\n      }\n    }<\/code><\/pre>\n<p>3.  <strong><code>TRANSIENT<\/code>:<\/strong> Bir sa\u011flay\u0131c\u0131 her enjekte edildi\u011finde yeni bir \u00f6rne\u011fi olu\u015fturulur. Bu, her bir ba\u011f\u0131ml\u0131l\u0131k noktas\u0131 i\u00e7in tamamen ba\u011f\u0131ms\u0131z bir \u00f6rnek istedi\u011finizde kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\n    import { Injectable, Scope } from '@nestjs\/common';\n\n    @Injectable({ scope: Scope.TRANSIENT })\n    class TransientService {\n      private id: number;\n\n      constructor() {\n        this.id = Math.random();\n        console.log(<code>TransientService instance created: ${this.id}<\/code>);\n      }\n\n      getId(): number {\n        return this.id;\n      }\n    }<\/code><\/pre>\n<p>    <code>REQUEST<\/code> veya <code>TRANSIENT<\/code> kapsaml\u0131 sa\u011flay\u0131c\u0131lar kullan\u0131rken performans etkilerini g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir, \u00e7\u00fcnk\u00fc her \u00f6rnek olu\u015fturma ek y\u00fck getirir.<\/p>\n<h3>Geli\u015fmi\u015f Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu Konular\u0131<\/h3>\n<p>NestJS&#8217;in DI sistemi, basit enjeksiyonun \u00f6tesine ge\u00e7erek daha karma\u015f\u0131k senaryolar\u0131 y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc \u00f6zellikler sunar.<\/p>\n<h4>Dairesel Ba\u011f\u0131ml\u0131l\u0131klar (Circular Dependencies)<\/h4>\n<p>\u0130ki s\u0131n\u0131f\u0131n birbirine ba\u011f\u0131ml\u0131 oldu\u011fu durumlar &#8220;dairesel ba\u011f\u0131ml\u0131l\u0131klar&#8221; olarak adland\u0131r\u0131l\u0131r (\u00f6rn: <code>ServiceA<\/code>&#8216;n\u0131n <code>ServiceB<\/code>&#8216;ye ve <code>ServiceB<\/code>&#8216;nin <code>ServiceA<\/code>&#8216;ya ba\u011f\u0131ml\u0131 olmas\u0131). Bu, uygulaman\u0131n ba\u015flat\u0131lmas\u0131n\u0131 engelleyebilecek yayg\u0131n bir sorundur. NestJS, bu durumu <code>forwardRef()<\/code> yard\u0131mc\u0131 fonksiyonu ile \u00e7\u00f6zmenize olanak tan\u0131r.<\/p>\n<p><code>forwardRef()<\/code> fonksiyonu, NestJS&#8217;e bir referans\u0131n hen\u00fcz tan\u0131mlanmam\u0131\u015f olabilece\u011fini ve mod\u00fcl\u00fcn ba\u015flat\u0131lmas\u0131 s\u0131ras\u0131nda \u00e7\u00f6z\u00fclmesi gerekti\u011fini bildirir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\nimport { Injectable, forwardRef, Inject } from '@nestjs\/common';\n\n@Injectable()\nclass ServiceA {\n  constructor(@Inject(forwardRef(() => ServiceB)) private readonly serviceB: ServiceB) {}\n\n  doSomething() {\n    this.serviceB.doAnotherThing();\n  }\n}\n\n@Injectable()\nclass ServiceB {\n  constructor(@Inject(forwardRef(() => ServiceA)) private readonly serviceA: ServiceA) {}\n\n  doAnotherThing() {\n    this.serviceA.doSomething();\n  }\n}<\/code><\/pre>\n<p>Hem <code>ServiceA<\/code> hem de <code>ServiceB<\/code> kurucular\u0131nda <code>forwardRef()<\/code> kullanarak birbirlerine olan ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 \u00e7\u00f6zebilirler. Ayr\u0131ca, mod\u00fcl tan\u0131m\u0131nda da <code>forwardRef()<\/code> kullanman\u0131z gerekebilir:<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\nimport { Module, forwardRef } from '@nestjs\/common';\nimport { ServiceA } from '.\/serviceA.service';\nimport { ServiceB } from '.\/serviceB.service';\n\n@Module({\n  imports: [forwardRef(() => AnotherModule)], \/\/ Mod\u00fcl seviyesinde dairesel ba\u011f\u0131ml\u0131l\u0131k\n  providers: [ServiceA, ServiceB],\n  exports: [ServiceA, ServiceB],\n})\nclass MyModule {}<\/code><\/pre>\n<h4>Asenkron Sa\u011flay\u0131c\u0131lar (Asynchronous Providers)<\/h4>\n<p>Veritaban\u0131 ba\u011flant\u0131lar\u0131, d\u0131\u015f API istemcileri veya ba\u015flatma s\u0131ras\u0131nda asenkron i\u015flemler gerektiren di\u011fer kaynaklar gibi sa\u011flay\u0131c\u0131lar\u0131 olu\u015fturman\u0131z gerekebilir. <code>useFactory<\/code> stratejisi, asenkron sa\u011flay\u0131c\u0131lar olu\u015fturmak i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r. Fabrika fonksiyonunuz bir <code>Promise<\/code> d\u00f6nd\u00fcrebilir ve NestJS, bu <code>Promise<\/code> \u00e7\u00f6z\u00fclene kadar uygulaman\u0131n ba\u015flat\u0131lmas\u0131n\u0131 bekleyecektir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\nimport { Module } from '@nestjs\/common';\n\nasync function createDatabaseConnection() {\n  \/\/ Asenkron veritaban\u0131 ba\u011flant\u0131s\u0131 kurma i\u015flemi\n  return new Promise(resolve => setTimeout(() => resolve({ client: 'DB_CLIENT' }), 2000));\n}\n\n@Module({\n  providers: [\n    {\n      provide: 'DATABASE_CONNECTION',\n      useFactory: async () => {\n        const connection = await createDatabaseConnection();\n        console.log('Database connected!');\n        return connection;\n      },\n    },\n  ],\n})\nclass AppModule {}<\/code><\/pre>\n<p>Bu, uygulaman\u0131z\u0131n veritaban\u0131 gibi kritik kaynaklara ba\u011flanmadan \u00f6nce tamamen ba\u015flat\u0131lmamas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Dinamik Mod\u00fcller (Dynamic Modules)<\/h4>\n<p>Dinamik mod\u00fcller, \u00e7al\u0131\u015fma zaman\u0131nda yap\u0131land\u0131r\u0131labilen mod\u00fcller olu\u015fturman\u0131za olanak tan\u0131r. Bu, \u00f6zellikle yap\u0131land\u0131rma se\u00e7eneklerini kabul eden veya \u00e7oklu \u00f6rnekler gerektiren genel mod\u00fcller (\u00f6rne\u011fin, bir yap\u0131land\u0131rma mod\u00fcl\u00fc, bir veritaban\u0131 mod\u00fcl\u00fc) olu\u015fturmak i\u00e7in kullan\u0131\u015fl\u0131d\u0131r. Dinamik mod\u00fcller genellikle <code>forRoot()<\/code> veya <code>forFeature()<\/code> statik metotlar\u0131 arac\u0131l\u0131\u011f\u0131yla tan\u0131mlan\u0131r.<\/p>\n<p>\u00d6rne\u011fin, bir yap\u0131land\u0131rma mod\u00fcl\u00fc:<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\nimport { Module, DynamicModule } from '@nestjs\/common';\nimport { ConfigService } from '.\/config.service';\n\ninterface ConfigModuleOptions {\n  folder: string;\n}\n\n@Module({})\nclass ConfigModule {\n  static forRoot(options: ConfigModuleOptions): DynamicModule {\n    return {\n      module: ConfigModule,\n      providers: [\n        {\n          provide: 'CONFIG_OPTIONS',\n          useValue: options,\n        },\n        ConfigService,\n      ],\n      exports: [ConfigService],\n    };\n  }\n}<\/code><\/pre>\n<p>Uygulama mod\u00fcl\u00fcn\u00fczde bu dinamik mod\u00fcl\u00fc \u015fu \u015fekilde i\u00e7e aktarabilirsiniz:<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\nimport { Module } from '@nestjs\/common';\nimport { ConfigModule } from '.\/config.module';\n\n@Module({\n  imports: [\n    ConfigModule.forRoot({ folder: '.\/config' }),\n  ],\n})\nclass AppModule {}<\/code><\/pre>\n<p>Bu sayede, <code>ConfigModule<\/code> uygulaman\u0131n farkl\u0131 yerlerinde farkl\u0131 se\u00e7eneklerle yap\u0131land\u0131r\u0131labilir.<\/p>\n<h4>Mod\u00fcl \u0130hracat\u0131 ve \u0130\u00e7e Aktar\u0131m\u0131 (Module Export and Import)<\/h4>\n<p>Ba\u011f\u0131ml\u0131l\u0131klar\u0131n mod\u00fcller aras\u0131nda payla\u015f\u0131lmas\u0131, <code>exports<\/code> ve <code>imports<\/code> dizileri arac\u0131l\u0131\u011f\u0131yla y\u00f6netilir. Bir mod\u00fcl, di\u011fer mod\u00fcllerin kullanabilmesi i\u00e7in sa\u011flay\u0131c\u0131lar\u0131n\u0131 <code>exports<\/code> dizisine ekleyebilir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\nimport { Module } from '@nestjs\/common';\nimport { UserService } from '.\/user.service';\n\n@Module({\n  providers: [UserService],\n  exports: [UserService], \/\/ UserService'i d\u0131\u015fa aktar\n})\nclass UserModule {}<\/code><\/pre>\n<p>Ba\u015fka bir mod\u00fcl\u00fcn <code>UserService<\/code>&#8216;i kullanabilmesi i\u00e7in <code>UserModule<\/code>&#8216;\u00fc <code>imports<\/code> dizisine eklemesi gerekir:<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\nimport { Module } from '@nestjs\/common';\nimport { UserModule } from '.\/user.module';\nimport { OrderService } from '.\/order.service';\n\n@Module({\n  imports: [UserModule], \/\/ UserModule'\u00fc i\u00e7e aktar\n  providers: [OrderService],\n})\nclass OrderModule {}<\/code><\/pre>\n<p>Art\u0131k <code>OrderModule<\/code> i\u00e7indeki <code>OrderService<\/code> veya di\u011fer sa\u011flay\u0131c\u0131lar, <code>UserService<\/code>&#8216;i enjekte edebilir.<\/p>\n<h4>\u00d6zel Enjeksiyon Tokenlar\u0131 (Custom Injection Tokens)<\/h4>\n<p>Bazen, bir s\u0131n\u0131f t\u00fcr\u00fc yerine string veya sembol gibi \u00f6zel bir token kullanarak bir ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 enjekte etmek isteyebilirsiniz. Bu, \u00f6zellikle \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerden de\u011ferleri enjekte ederken veya ayn\u0131 t\u00fcrden birden fazla sa\u011flay\u0131c\u0131y\u0131 ay\u0131rt etmeniz gerekti\u011finde kullan\u0131\u015fl\u0131d\u0131r. <code>@Inject()<\/code> dekorat\u00f6r\u00fc, \u00f6zel tokenlar\u0131 belirtmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\nimport { Injectable, Inject } from '@nestjs\/common';\n\nconst MY_CONSTANT_TOKEN = 'MY_CONSTANT_TOKEN'; \/\/ String token\n\n@Injectable()\nclass MyService {\n  constructor(@Inject(MY_CONSTANT_TOKEN) private readonly myConstant: string) {}\n\n  getConstant(): string {\n    return this.myConstant;\n  }\n}\n\n\/\/ Mod\u00fcl tan\u0131m\u0131nda:\nimport { Module } from '@nestjs\/common';\nimport { MyService } from '.\/my.service';\n\n@Module({\n  providers: [\n    MyService,\n    {\n      provide: MY_CONSTANT_TOKEN,\n      useValue: 'Hello from custom token!',\n    },\n  ],\n})\nclass AppModule {}<\/code><\/pre>\n<p>Semboller de \u00f6zel token olarak kullan\u0131labilir, bu da string \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nleyebilir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\nimport { Injectable, Inject } from '@nestjs\/common';\n\nconst DATABASE_CONNECTION_TOKEN = Symbol('DATABASE_CONNECTION'); \/\/ Sembol token\n\n@Injectable()\nclass DataRepository {\n  constructor(@Inject(DATABASE_CONNECTION_TOKEN) private readonly dbConnection: any) {}\n\n  \/\/ ...\n}<\/code><\/pre>\n<h3>Pratik \u00d6rnekler ve En \u0130yi Uygulamalar<\/h3>\n<p>NestJS&#8217;in ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu sistemi, uygulamalar\u0131n\u0131z\u0131 daha yap\u0131land\u0131r\u0131lm\u0131\u015f, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmenin anahtar\u0131d\u0131r. \u0130\u015fte baz\u0131 pratik \u00f6rnekler ve en iyi uygulamalar:<\/p>\n<p>1.  <strong>Servisleri Enjekte Etme:<\/strong> En yayg\u0131n senaryo, i\u015f mant\u0131\u011f\u0131n\u0131 kaps\u00fclleyen servis s\u0131n\u0131flar\u0131n\u0131 denetleyicilere veya di\u011fer servislere enjekte etmektir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\n    \/\/ user.service.ts\n    @Injectable()\n    class UserService { \/<em> ... <\/em>\/ }\n\n    \/\/ auth.service.ts\n    @Injectable()\n    class AuthService {\n      constructor(private readonly userService: UserService) {} \/\/ UserService enjekte edildi\n      \/\/ ...\n    }\n\n    \/\/ auth.controller.ts\n    @Controller('auth')\n    class AuthController {\n      constructor(private readonly authService: AuthService) {} \/\/ AuthService enjekte edildi\n      \/\/ ...\n    }<\/code><\/pre>\n<p>2.  <strong>Yap\u0131land\u0131rma Enjeksiyonu:<\/strong> Uygulama ayarlar\u0131n\u0131 veya \u00e7evresel de\u011fi\u015fkenleri enjekte etmek i\u00e7in \u00f6zel sa\u011flay\u0131c\u0131lar\u0131 veya dinamik mod\u00fclleri kullan\u0131n. NestJS&#8217;in kendi <code>@nestjs\/config<\/code> paketi, bu t\u00fcr senaryolar i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\n    import { Module } from '@nestjs\/common';\n    import { ConfigModule, ConfigService } from '@nestjs\/config';\n\n    @Module({\n      imports: [ConfigModule.forRoot()], \/\/ .env dosyas\u0131n\u0131 otomatik y\u00fckler\n      providers: [\n        {\n          provide: 'API_KEY',\n          useFactory: (configService: ConfigService) => configService.get('API_KEY'),\n          inject: [ConfigService],\n        },\n      ],\n      exports: ['API_KEY'],\n    })\n    class AppConfigModule {}<\/code><\/pre>\n<p>3.  <strong>Veritaban\u0131 Ba\u011flant\u0131lar\u0131:<\/strong> Asenkron sa\u011flay\u0131c\u0131lar, veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131 uygulaman\u0131n ba\u015flat\u0131lmas\u0131 s\u0131ras\u0131nda g\u00fcvenli ve y\u00f6netilebilir bir \u015fekilde kurmak i\u00e7in idealdir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu bir kod \u00f6rne\u011fi de\u011fil, kavramsal bir g\u00f6sterimdir.\n    \/\/ database.provider.ts\n    import { Provider } from '@nestjs\/common';\n    import { createConnection } from 'typeorm';\n\n    export const databaseProviders: Provider[] = [\n      {\n        provide: 'DATABASE_CONNECTION',\n        useFactory: async () => await createConnection({\n          type: 'postgres',\n          host: process.env.DB_HOST,\n          port: parseInt(process.env.DB_PORT, 10),\n          username: process.env.DB_USERNAME,\n          password: process.env.DB_PASSWORD,\n          database: process.env.DB_DATABASE,\n          entities: [__dirname + '\/..\/<em><\/em>\/*.entity{.ts,.js}'],\n          synchronize: true,\n        }),\n      },\n    ];\n\n    \/\/ database.module.ts\n    import { Module } from '@nestjs\/common';\n    import { databaseProviders } from '.\/database.providers';\n\n    @Module({\n      providers: [...databaseProviders],\n      exports: [...databaseProviders],\n    })\n    export class DatabaseModule {}<\/code><\/pre>\n<p><strong>En \u0130yi Uygulamalar:<\/strong><\/p>\n<p>*   <strong>Tek Sorumluluk \u0130lkesi (SRP):<\/strong> Her sa\u011flay\u0131c\u0131n\u0131n veya s\u0131n\u0131f\u0131n tek bir sorumlulu\u011fu olmal\u0131d\u0131r. DI, bu ilkeye uymay\u0131 kolayla\u015ft\u0131r\u0131r \u00e7\u00fcnk\u00fc ba\u011f\u0131ml\u0131l\u0131klar a\u00e7\u0131k\u00e7a tan\u0131mlan\u0131r ve enjekte edilir.<br \/>\n*   <strong>K\u00fc\u00e7\u00fck ve Odaklanm\u0131\u015f Mod\u00fcller:<\/strong> Uygulaman\u0131z\u0131 k\u00fc\u00e7\u00fck, odaklanm\u0131\u015f mod\u00fcllere ay\u0131r\u0131n. Her mod\u00fcl kendi ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netmeli ve yaln\u0131zca d\u0131\u015fa aktarmas\u0131 gereken sa\u011flay\u0131c\u0131lar\u0131 d\u0131\u015fa aktarmal\u0131d\u0131r.<br \/>\n*   <strong>Soyutlamalara Ba\u011f\u0131ml\u0131l\u0131k:<\/strong> Somut uygulamalara do\u011frudan ba\u011f\u0131ml\u0131l\u0131k yerine aray\u00fczlere veya soyut s\u0131n\u0131flara ba\u011f\u0131ml\u0131l\u0131k olu\u015fturun. Bu, <code>useClass<\/code> gibi \u00f6zel sa\u011flay\u0131c\u0131larla farkl\u0131 uygulamalar\u0131 kolayca de\u011fi\u015ftirebilmenizi sa\u011flar.<br \/>\n*   <strong>Kapsamlar\u0131 Dikkatli Kullan\u0131n:<\/strong> Varsay\u0131lan (singleton) kapsam genellikle en iyi performans\u0131 sa\u011flar. <code>REQUEST<\/code> veya <code>TRANSIENT<\/code> kapsamlar\u0131n\u0131 yaln\u0131zca ger\u00e7ekten ihtiyac\u0131n\u0131z oldu\u011funda kullan\u0131n ve performans \u00fczerindeki potansiyel etkilerini anlay\u0131n.<br \/>\n*   <strong>Dairesel Ba\u011f\u0131ml\u0131l\u0131klardan Ka\u00e7\u0131n\u0131n:<\/strong> M\u00fcmk\u00fcn oldu\u011funca dairesel ba\u011f\u0131ml\u0131l\u0131klardan ka\u00e7\u0131nmak i\u00e7in tasar\u0131m\u0131n\u0131z\u0131 g\u00f6zden ge\u00e7irin. <code>forwardRef()<\/code> bir \u00e7\u00f6z\u00fcmd\u00fcr, ancak genellikle daha iyi bir mimari tasar\u0131m\u0131n m\u00fcmk\u00fcn oldu\u011funa i\u015faret eder.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>NestJS&#8217;in ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu sistemi, modern Node.js uygulamalar\u0131 geli\u015ftirirken kar\u015f\u0131la\u015f\u0131lan karma\u015f\u0131kl\u0131\u011f\u0131 y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir ara\u00e7t\u0131r. IoC konteyneri, sa\u011flay\u0131c\u0131lar\u0131n ve t\u00fcketicilerin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc otomatik olarak y\u00f6neterek, geli\u015ftiricilerin i\u015f mant\u0131\u011f\u0131na odaklanmas\u0131n\u0131 sa\u011flar. Standart s\u0131n\u0131f tabanl\u0131 sa\u011flay\u0131c\u0131lardan \u00f6zel sa\u011flay\u0131c\u0131lara, kapsam y\u00f6netimine ve dinamik mod\u00fcllere kadar geni\u015f bir yelpazede \u00f6zellikler sunarak, NestJS her t\u00fcrl\u00fc senaryoya uyum sa\u011flayabilir.<\/p>\n<p>Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunu do\u011fru bir \u015fekilde anlamak ve kullanmak, NestJS uygulamalar\u0131n\u0131z\u0131n test edilebilirli\u011fini, mod\u00fclerli\u011fini, esnekli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r. Bu rehber, NestJS&#8217;teki ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunun temelini ve ileri d\u00fczey konular\u0131n\u0131 anlaman\u0131za yard\u0131mc\u0131 olarak, daha iyi ve daha sa\u011flam uygulamalar geli\u015ftirmenize katk\u0131da bulunmay\u0131 ama\u00e7lam\u0131\u015ft\u0131r. NestJS&#8217;in sa\u011flad\u0131\u011f\u0131 bu g\u00fc\u00e7l\u00fc mekanizma sayesinde, karma\u015f\u0131k sistemleri bile temiz, d\u00fczenli ve y\u00f6netilebilir bir \u015fekilde in\u015fa edebilirsiniz.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"NestJS&#8217;te Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu: Kapsaml\u0131 Bir Rehber\nGiri\u015f: Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu Nedir ve Neden \u00d6nemlidir?\nYaz\u0131l\u0131m geli\u015ftirmede &#8220;ba","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-33170","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>NestJS&#039;te Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"NestJS&#039;te Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"NestJS&#039;te Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu: Kapsaml\u0131 Bir Rehber Giri\u015f: Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu Nedir ve Neden \u00d6nemlidir? Yaz\u0131l\u0131m geli\u015ftirmede &quot;ba\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-30T11:41:09+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"NestJS&#8217;te Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-10-30T11:41:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/\"},\"wordCount\":2525,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/\",\"name\":\"NestJS'te Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-30T11:41:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"NestJS&#8217;te Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"NestJS'te Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"NestJS'te Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu: Kapsaml\u0131 Bir Rehber","og_description":"NestJS'te Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu: Kapsaml\u0131 Bir Rehber Giri\u015f: Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu Nedir ve Neden \u00d6nemlidir? Yaz\u0131l\u0131m geli\u015ftirmede \"ba","og_url":"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-30T11:41:09+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"NestJS&#8217;te Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu: Kapsaml\u0131 Bir Rehber","datePublished":"2025-10-30T11:41:09+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/"},"wordCount":2525,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/","name":"NestJS'te Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-30T11:41:09+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/nestjste-bagimlilik-enjeksiyonu-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"NestJS&#8217;te Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33170","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=33170"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33170\/revisions"}],"predecessor-version":[{"id":33171,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33170\/revisions\/33171"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}