Dependency Injection (DI): .NET ile Bağımlılık Yönetimi

crazy_coder

Moderatör
Katılım
20 Şub 2026
Mesajlar
204
Tepkime puanı
0
Puanları
16

C# Dependency Injection (DI): Bağımlılıkları Yönetme Sanatı​


Dependency Injection, bir sınıfın ihtiyaç duyduğu nesneleri (bağımlılıkları) kendi içinde oluşturması yerine, bu nesnelerin dışarıdan o sınıfa "enjekte edilmesi" prensibidir. Bu sayede sınıflar birbirine sıkı sıkıya bağlı (tightly coupled) olmaktan kurtulur.



1. Neden İhtiyaç Duyarız? (Sıkı Bağlılık Sorunu)​


Diyelim ki bir SiparisServisi sınıfınız var ve içinde loglama yapmak istiyorsunuz.

Kötü Yaklaşım (New'leme):
C#:
public class SiparisServisi
{
private DosyaLoglama _logger = new DosyaLoglama(); // Sıkı bağlılık!

public void Onayla() { _logger.Log("Sipariş verildi."); }

}
Yukarıdaki kodda, yarın bir gün logları dosyaya değil de veritabanına yazmak isterseniz, SiparisServisi kodunu değiştirmek zorunda kalırsınız. Bu da Open-Closed Prensibi'ne aykırıdır.



2. Çözüm: Arayüzler (Interfaces) ile Enjeksiyon​


DI kullanırken sınıflar somut nesnelere değil, arayüzlere bağımlı hale getirilir.

C#:
public interface ILogger { void Log(string mesaj); }

public class SiparisServisi
{
private readonly ILogger _logger;

// Bağımlılık dışarıdan yapıcı metot ile geliyor
public SiparisServisi(ILogger logger)
{
    _logger = logger;
}

public void Onayla() { _logger.Log("Sipariş onaylandı."); }

}



3. .NET Service Lifetime (Servis Ömürleri)​


.NET içerisinde servislerinizi kaydederken (genellikle Program.cs içinde), bu nesnelerin ne kadar süre yaşayacağını belirlemeniz gerekir. Bu, bellek yönetimi için kritiktir.

LifetimeAçıklama
TransientServis her istendiğinde yeni bir örneği oluşturulur. Kısa ömürlü işler için uygundur.
ScopedHer bir HTTP isteği (Request) boyunca tek bir örnek yaşar. Request bitince imha edilir.
SingletonUygulama başladığında bir kez oluşturulur ve kapanana kadar aynı örnek kullanılır.



4. Servislerin Kaydedilmesi ve Kullanılması​


Modern .NET uygulamalarında bu kayıt işlemi Program.cs dosyasında yapılır:

C#:
var builder = WebApplication.CreateBuilder(args);

// Servisleri konteynere ekleyelim
builder.Services.AddScoped<ILogger, VeritabaniLoglama>();
builder.Services.AddScoped<SiparisServisi>();

var app = builder.Build();

Bu kayıt yapıldıktan sonra, .NET çalışma zamanı SiparisServisi oluşturulurken otomatik olarak içine bir VeritabaniLoglama nesnesi yerleştirir. Sizin new demenize gerek kalmaz!



5. DI Kullanmanın Avantajları​



  • []Test Edilebilirlik: Gerçek bir veritabanı yerine "Mock" (sahte) bir servis enjekte ederek birim testleri (unit tests) kolayca yazabilirsiniz.
    []Esneklik: Uygulamanın bir parçasını değiştirmek için sadece kayıt satırını güncellemeniz yeterlidir.
  • Temiz Kod: Nesne oluşturma sorumluluğu sınıflardan alınmış olur, kod daha sadeleşir.



Sonuç​


Dependency Injection, modern yazılım geliştirmenin temel taşıdır. Başlangıçta "neden bu kadar dolambaçlı yoldan yapıyoruz?" gibi görünebilir; ancak projeniz büyüdükçe bu yapının kodunuzu ne kadar esnek ve yönetilebilir kıldığını fark edeceksiniz.
 
Geri
Üst