C#
DI nedir?
Bağımlılık enjeksiyonunun ne olduğunu ve neden kullanıldığını öğrenirsin.
Bağımlılık enjeksiyonu nedir?
Bağımlılık enjeksiyonu (DI), bir sınıfın ihtiyaç duyduğu bağımlılıkları kendisi üretmesi yerine dışarıdan almasıdır. Örneğin Service sınıfı bir ILogger gerektiriyorsa, kendi içinde new ConsoleLogger() yapmak yerine bunu dışarıdan alır.
Bu yaklaşım sınıfları birbirinden bağımsızlaştırır; böylece test etmek kolaylaşır ve değişiklikler dar alanlarda kalır. DI, Inversion of Control (IoC) ilkesinin yaygın bir uygulamasıdır; denetim sınıftan kapsayıcıya geçer.
Inversion of Control
IoC, denetimin ters çevrimi anlamına gelir: sınıf, bağımlılıklarını kendisi yaratmaz; bu işi dışarıdaki bir kapsayıcı (container) üstlenir. Sınıf yalnızca neye ihtiyacı olduğunu bildirir; kapsayıcı örnekleri üretip verir.
DI, IoC'nin yaygın bir uygulamasıdır. Kapsayıcı, kayıtlı bağımlılıkları çözer, yaşam süreçlerini yönetir ve gerekirse örnekleri dispos eder. Bu, özellikle büyük uygulamalarda tutarlı bir yapı sağlar.
Uygulama Service'e logger enjekte et
Main içinde ILogger logger = new ConsoleLogger(); ile bir logger oluştur. Service s = new Service(logger); ile servise logger'ı geçir. s.DoWork() ile çalıştır.
Örnek çözümü göster
ILogger logger = new ConsoleLogger(); ile logger oluştur. Service s = new Service(logger); ile servisi oluştur. s.DoWork(); ile çağır.
Örnek çözüm:
using System;
interface ILogger { void Log(string msg); }
class ConsoleLogger : ILogger
{
public void Log(string msg) => Console.WriteLine(msg);
}
class Service
{
private readonly ILogger _logger;
public Service(ILogger logger) { _logger = logger; }
public void DoWork() => _logger.Log("Çalışıyor");
}
class Program
{
static void Main()
{
ILogger logger = new ConsoleLogger();
Service s = new Service(logger);
s.DoWork();
}
}
Kendini test et
-
DI'nın temel amacı nedir?
- Kodu daha hızlı çalıştırmak
- Sınıfları birbirinden bağımsızlaştırmak ve test kolaylığı sağlamak
- Daha az bellek kullanmak
- Derleme süresini kısaltmak
Cevabı göster
Sınıfları birbirinden bağımsızlaştırmak ve test kolaylığı sağlamak — Doğru. DI sınıfları bağımsızlaştırır ve test kolaylığı sağlar.
-
Constructor injection'ı tamamla
class Service { private readonly IRepo _repo; public Service(____ repo) { _repo = repo; } }
Cevabı göster
class Service { private readonly IRepo _repo; public Service(IRepo repo) { _repo = repo; } }
-
Kavramı açıklamasına eşle
- DI
- Dışarıdan bağımlılık verme
- IoC
- Denetimin ters çevrimi
- Container
- Bağımlılıkları yönetir
- Lifetime
- Ömrü belirler
Sıradaki ders: Constructor injection