Dependency injection (bağımlılık enjeksiyonu) başta karmaşık gelen ama bir kez anlaşılınca kodun neden bu kadar test edilemez ve bakım yapılamaz olduğunu açıklayan bir tasarım desenidir. **Sorun ne?** Bir sınıfın ihtiyaç duyduğu nesneleri (bağımlılıklarını) kendi içinde oluşturmasına kötü bir pratik denir. Örneğin: ```python class SiparisServisi: def __init__(self): self.db = VeritabaniBaglantisi() # kötü ``` Bu tasarımda SiparisServisi'ni test etmek için gerçek bir veritabanı bağlantısı açmak zorunlu olursunuz. Ayrıca bağımlılığı değiştirmek için sınıfın içini değiştirmeniz gerekir. **Dependency injection nasıl çözer?** Bağımlılık dışarıdan verilir: ```python class SiparisServisi: def __init__(self, db): # dışarıdan enjekte edilir self.db = db ``` Artık testte sahte bir db nesnesi verebilirsiniz. Üretimde gerçek veritabanı. Sınıf değişmeden kalır. **Ne zaman kullanmak gerekir?** - **Test yazacaksanız:** Dependency injection olmadan unit test yazmak neredeyse imkansızdır. Mock ya da stub kullanmak için bağımlılıkların dışarıdan verilmesi şarttır. - **Bağımlılığın değişme olasılığı varsa:** Bugün MySQL, yarın PostgreSQL. Dependency injection ile geçiş kod değişikliği gerektirmez. - **Çoklu konfigürasyonlar gerekiyorsa:** Test, staging, üretim ortamları farklı servisler kullanabilir. **Ne zaman gerekmez?** Çok küçük script'lerde ya da bağımlılığın hiç değişmeyeceği kesin olan durumlarda dependency injection gereksiz karmaşıklık getirebilir. Her yerde uygulama zorunluluğu yok. **Framework desteği** Spring (Java), Laravel (PHP), .NET Core, Angular gibi framework'ler dependency injection'ı yerleşik olarak destekler. Python'da manuel enjeksiyon ya da basit kütüphaneler kullanılır. **Özet karar:** Test yazıyorsanız, bağımlılığınız değişebilirse veya kodunuzu yeniden kullanılabilir yapmak istiyorsanız dependency injection uygulayın.