Ana içeriğe geç

Dependency Injection

Bağımlılık Enjeksiyonu

Türkçe karşılığı
bağımlılık ekleme
Okunuşu
dipendınsi incekşın

Günlük kullanımda çoğunlukla İngilizcesi tercih edilir.

Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/dependency-injection

Kısaca

Dependency injection, bir nesnenin ihtiyaç duyduğu diğer nesneleri kendisi oluşturmak yerine dışarıdan almasını sağlayan bir tasarım tekniğidir.

Dependency injection nedir?

Bağımlılık (dependency), bir kod parçasının işini yapmak için ihtiyaç duyduğu veritabanı bağlantısı, logger ya da e-posta istemcisi gibi her nesne veya servistir. Dependency injection ile bir sınıf kendi bağımlılıklarını new ile oluşturmaz; bunlar dışarıdan, çoğunlukla constructor aracılığıyla verilir. Sınıf yalnızca neye ihtiyaç duyduğunu belirtir, hangi somut uygulamanın sağlanacağına ise başka kod karar verir.

Üç yaygın biçimi vardır: bağımlılıkların nesne oluşturulurken verildiği constructor injection; sonradan atandığı setter ya da property injection; ve tek bir fonksiyon çağrısına geçirildiği parametre injection. Daha büyük uygulamalarda bu bağlantıyı çoğunlukla DI container üstlenir; bu, nesneleri oluşturan ve bağımlılıklarını otomatik sağlayan bir framework bileşenidir.

En büyük kazanç test edilebilirlik ve esnekliktir. Bir servis veritabanını ya da ödeme istemcisini dışarıdan aldığı için bir test öngörülebilir veri döndüren sahte bir sürüm verebilir, üretim kodu ise servisi düzenlemeden e-posta sağlayıcısını değiştirebilir. Faydalı bir benzetme fişli bir lambadır: lamba kendi elektriğini üretmez, bağlandığı prizden gelen enerjiyle çalışır.

Dependency injection çoğunlukla SOLID'deki D olan Bağımlılığın Tersine Çevrilmesi İlkesi ile karıştırılır. Dependency inversion, kodun arayüz gibi soyutlamalara bağımlı olması gerektiğini söyleyen tasarım kuralıdır; dependency injection ise bu soyutlamaları sağlamanın pratik bir tekniğidir. Inversion of control (kontrolün tersine çevrilmesi) ise nesnelerin nasıl oluşturulup bağlanacağını sizin kodunuzun değil bir framework'ün ya da çağıranın belirlediği daha geniş fikirdir ve DI bunu başarmanın yollarından biridir.

Önemli noktalar

  • Dependency injection, bir sınıfa ihtiyaç duyduğu nesneleri kendisi oluşturtmak yerine dışarıdan verir.
  • Constructor injection en yaygın ve en açık biçimdir.
  • Gerçek bağımlılıklar sahtelerle değiştirilebildiği için kodu test etmeyi kolaylaştırır.
  • DI container'lar büyük uygulamalarda bağlantıyı otomatikleştirir.
  • DI, Bağımlılığın Tersine Çevrilmesi İlkesi'ni uygulamak için bir tekniktir.

Örnek

TypeScript'te constructor injectiontypescript
interface Mailer {
  send(to: string, text: string): Promise<void>;
}

class SignupService {
  // The dependency is injected through the constructor
  constructor(private mailer: Mailer) {}
  async register(email: string) {
    await this.mailer.send(email, "Welcome aboard!");
  }
}

// Production passes a real mailer; a test can inject a fake one
const fakeMailer: Mailer = { send: async () => {} };
new SignupService(fakeMailer).register("ada@example.com");

Sık sorulan sorular

Dependency injection ile dependency inversion arasındaki fark nedir?

Dependency inversion, kodun somut sınıflara değil soyutlamalara bağımlı olması gerektiğini söyleyen bir tasarım ilkesidir. Dependency injection ise bağımlılıkları dışarıdan sağlama tekniğidir ve bu ilkeyi izlemenin en yaygın yoludur.

Dependency injection için framework gerekir mi?

Hayır. Bağımlılıkları constructor'lar ya da fonksiyon parametreleri aracılığıyla geçirmek de dependency injection'dır ve her dilde çalışır. DI container'lar, bir uygulamada çok sayıda servis olduğunda bağlantıyı otomatikleştiren isteğe bağlı araçlardır.

Dependency injection testi neden kolaylaştırır?

Test edilen kod bağımlılıklarını dışarıdan aldığı için test, öngörülebilir sonuçlar döndüren sahte (fake) ya da mock nesneler verebilir. Bu sayede mantığı gerçek bir veritabanı, ağ ya da e-posta sunucusu olmadan test edebilirsiniz.

İlgili sayfalar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar