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."); }
}
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.
| Lifetime | Açıklama |
|---|---|
| Transient | Servis her istendiğinde yeni bir örneği oluşturulur. Kısa ömürlü işler için uygundur. |
| Scoped | Her bir HTTP isteği (Request) boyunca tek bir örnek yaşar. Request bitince imha edilir. |
| Singleton | Uygulama 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.