CodeBlanks Logo Icon CodeBlanks

DI nedir?

C# kursu · İleri seviye · Ders 55/83

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

  1. 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.

  2. 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; } }
  3. 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

İleri seviye bölümündeki tüm dersler