CodeBlanks Logo Icon CodeBlanks

Dependency injection

Dependency injection öğrenirsin.

Dependency injection

Dependency injection (DI), bir nesnenin bağımlılıklarını kendisi yaratmak yerine dışarıdan almasıdır. Kurucu (constructor) üzerinden enjekte edilir; bu test ve değiştirmeyi kolaylaştırır.

Örnek: class OrderService { final PaymentService payment; OrderService(this.payment); }. OrderService PaymentService'i kendisi yaratmaz; dışarıdan alır. Testte sahte bir servis verilir.

DI sayesinde somut sınıfa değil arayüze bağımlı olursun. PaymentService arayüzüne StripePayment veya PaypalPayment verilebilir; OrderService fark etmez.

DI kapsayıcısı

Bir Container (kapsayıcı) bağımlılıkları kaydeder ve çözümler. container.register('math', MathService()) ile kaydedilir; container.resolve<MathService>('math') ile çözülür.

Kapsayıcı, yaşam süresi (lifetime) de yönetir: her çağrıda yeni örnek (transient) veya tek örnek (singleton). Bu, nesne yaratma mantığını tek bir yerde toplar.

Büyük uygulamalarda kapsayıcı, başlangıçta (startup) tüm bağımlılıkları kaydeder. Çalışma sırasında sadece resolve çağrılır; yaratma detayı gizli kalır.

Uygulama PaymentService ve OrderService tanımla

Bir abstract class PaymentService tanımla: bool pay(int amount);. Bir class StripePayment implements PaymentService tanımla: @override bool pay(int amount) => true;. Bir class OrderService tanımla: final PaymentService payment; OrderService(this.payment); String checkout(int amount) { final ok = payment.pay(amount); return ok ? 'paid: $amount' : 'failed'; }. main içinde final order = OrderService(StripePayment()); yarat ve print(order.checkout(100)); ekle.

Başlangıç kodu

main.dart
void main() {
  // abstract PaymentService tanımla (pay metodu)
  // StripePayment tanımla (arayüzü uygular)
  // OrderService sınıfını tanımla (payment alanı, checkout metodu)
  // bir OrderService yarat; checkout(100) yazdır
}

Örnek çözüm

main.dart
abstract class PaymentService {
  bool pay(int amount);
}

class StripePayment implements PaymentService {
  @override
  bool pay(int amount) => true;
}

class OrderService {
  final PaymentService payment;
  OrderService(this.payment);
  String checkout(int amount) {
    final ok = payment.pay(amount);
    return ok ? 'paid: $amount' : 'failed';
  }
}

void main() {
  final order = OrderService(StripePayment());
  print(order.checkout(100));
}

Beklenen çıktı

paid: 100

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Dependency injection neyi kolaylaştırır?

  • Arayüz çizimi
  • Dosya okuma
  • Test ve değiştirme Doğru cevap
  • Ağ dinleme

Açıklama: DI testte sahte bağımlılık vermeyi ve değiştirmeyi kolaylaştırır.

2 DI parçalarını eşleştir

Kavram Anlamı
constructor Enjeksiyon noktası
inject Bağımlılık verme
Container Sağlayıcı
resolve Çözme

3 Kurucu enjeksiyon

Soru
class OrderService {
  final ____ payment;
  OrderService(this.payment);
}
Cevap
class OrderService {
  final PaymentService payment;
  OrderService(this.payment);
}

Açıklama: bağımlılık arayüz türüyle bildirilir.

Uzman bölümündeki tüm dersler