Dependency injection
- Dart kursu
- Uzman
- Ders 34/47
- 5 dk
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
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
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
class OrderService {
final ____ payment;
OrderService(this.payment);
}
class OrderService {
final PaymentService payment;
OrderService(this.payment);
}
Açıklama: bağımlılık arayüz türüyle bildirilir.