Dependency Injection nedir? IoC container ne işe yarar?
Cevap
Dependency Injection (DI), bir sınıfın ihtiyaç duyduğu bağımlılıkları kendisinin oluşturması yerine dışarıdan almasıdır. Bu, Inversion of Control (IoC) prensibinin bir uygulamasıdır: nesne oluşturma kontrolü sınıftan alınıp dışarıya verilir.
DI olmadan
class OrderService:
def __init__(self):
self.repo = PostgresOrderRepo() # somut sınıfa sıkı bağlı
self.mailer = SmtpMailer("smtp.example.com")Test yazarken gerçek veritabanı ve SMTP gerekir; implementasyonu değiştirmek için sınıfı değiştirmek gerekir.
DI ile
class OrderService:
def __init__(self, repo: OrderRepo, mailer: Mailer):
self.repo = repo
self.mailer = mailer
# Üretim
service = OrderService(PostgresOrderRepo(db), SmtpMailer(cfg))
# Test
service = OrderService(InMemoryOrderRepo(), FakeMailer())Enjeksiyon türleri
- Constructor injection: önerilen yöntem. Bağımlılıklar zorunlu ve görünür, nesne her zaman geçerli durumda oluşur.
- Setter/property injection: opsiyonel bağımlılıklar için.
- Method injection: yalnızca tek bir çağrıda gereken bağımlılık için.
IoC container
Büyük uygulamalarda nesne grafiğini elle kurmak zahmetlidir. Container (Spring, .NET IServiceCollection, NestJS, Angular) bağımlılıkları kayıttan çözer, nesneleri oluşturur ve yaşam süresini yönetir:
| Ömür | Anlamı |
|---|---|
| Singleton | Uygulama boyunca tek örnek |
| Scoped | İstek (request) başına bir örnek |
| Transient | Her talepte yeni örnek |
Klasik hata: singleton bir servise scoped bir bağımlılık (ör. DB context) enjekte etmek; scoped nesne gereğinden uzun yaşar (captive dependency).
DI bir container gerektirmez; elle yapılan constructor injection da DI'dır. Container yalnızca kolaylık sağlar.
İlgili OOP & Tasarım Desenleri soruları
- Clean code nedir? Yaygın code smell'ler nelerdir?
- Strategy deseni nedir? if/else zincirlerini nasıl ortadan kaldırır?
- Observer deseni nedir? Gerçek hayatta nerelerde karşımıza çıkar?
- Factory deseni nedir? Ne zaman kullanılır?
- Singleton deseni nedir? Neden bazen anti-pattern olarak görülür?
- Interface ile abstract class arasındaki fark nedir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.