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.
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
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
- SOLIDYazılım Mimarisi, s. 39SOLID, geliştiricilerin daha anlaşılır, genişletilebilir, test edilebilir ve bakımı kolay kod yazmasına yardım eden beş nesne yönelimli tasarım ilkesidir.
- Tasarım DeseniYazılım Mimarisi, s. 42Tasarım deseni, yazılım tasarımında sık görülen bir soruna kanıtlanmış, yeniden kullanılabilir çözümdür; hazır kod değil, genel bir şablon olarak anlatılır.
- OOPProgramlamanın Temelleri, s. 41OOP, yani nesne yönelimli programlama, kodu ilişkili verileri onlar üzerinde işlem yapan fonksiyonlarla birleştiren nesneler etrafında düzenleme yöntemidir.
- SınıfProgramlamanın Temelleri, s. 49Sınıf, nesne yönelimli programlamada bir grup nesnenin paylaştığı veri ve davranışı tanımlayan, nesnelerin örnek olarak ondan oluşturulduğu bir plandır.
- İlgilerin AyrılmasıYazılım Mimarisi, s. 19İlgilerin ayrılması, bir programı her biri davranışının açıkça tanımlanmış tek bir yönünden sorumlu ayrı parçalara bölen bir tasarım ilkesidir.
- Clean ArchitectureYazılım Mimarisi, s. 5Clean architecture, temel iş kuralları framework'e, veritabanına ya da kullanıcı arayüzüne asla bağımlı olmasın diye yazılımı katmanlara ayırma yöntemidir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin