CodeBlanks Logo Icon CodeBlanks

Constructor injection

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

Yapıcı enjeksiyon ile bağımlılık geçmeyi öğrenirsin.

Constructor injection

Constructor injection, bağımlılığın sınıfın yapıcı metoduna parametre olarak geçirilmesidir. Gelen bağımlılık private readonly bir alanda saklanır. Bu, en yaygın DI desenidir.

Yapıcı enjeksiyon, bağımlılığın sınıf ömrü boyunca değişmeyeceğini garanti eder. readonly anahtar kelimesi, alanın yalnızca yapıcı içinde atanabilmesini sağlar; sonradan değiştirilemez. Testlerde sahte bağımlılıklar rahatça geçirilebilir.

Readonly alan

Bağımlılık private readonly ILogger _logger; biçiminde saklanır. readonly, alanın yalnızca yapıcı içinde (veya tanımlandığı yerde) atanabileceğini belirtir. Sonradan değiştirilemez.

Bu, bağımlılığın değişmezliğini garanti eder ve yanlışlıkla yeniden atanmasını önler. Testlerde sahte bir logger ile gerçek logger'ı değiştirmek istediğinde, yeni bir örnek oluşturup yapıcıya geçirmen yeterlidir; mevcut örneğin alanını değiştiremezsin.

Uygulama İki bağımlılığı yapıcıyla geçir

Aşağıdaki Service sınıfının yapıcısını tanımla: public Service(ILogger logger, IRepo repo) imzasıyla. Gövdede _logger = logger; ve _repo = repo; atamalarını yap. Main içinde new Service(new ConsoleLogger(), new FakeRepo()) ile oluştur ve s.DoWork() ile çağır.

Örnek çözümü göster
public Service(ILogger logger, IRepo repo) { _logger = logger; _repo = repo; } ekle. Main içinde: Service s = new Service(new ConsoleLogger(), new FakeRepo()); s.DoWork();
Örnek çözüm:
using System;

interface ILogger { void Log(string msg); }
interface IRepo { string Get(); }

class ConsoleLogger : ILogger
{
    public void Log(string msg) => Console.WriteLine(msg);
}

class FakeRepo : IRepo
{
    public string Get() => "Veri";
}

class Service
{
    private readonly ILogger _logger;
    private readonly IRepo _repo;
    public Service(ILogger logger, IRepo repo)
    {
        _logger = logger;
        _repo = repo;
    }
    public void DoWork() => _logger.Log(_repo.Get());
}

class Program
{
    static void Main()
    {
        Service s = new Service(new ConsoleLogger(), new FakeRepo());
        s.DoWork();
    }
}

Kendini test et

  1. Yapıcı parametresini tamamla

    public Service(ILogger ____) { _logger = logger; }
    Cevabı göster
    public Service(ILogger logger) { _logger = logger; }
  2. Constructor injection'da bağımlılık nerede saklanır?

    • Bir local değişkende
    • Bir static alanda
    • Bir property içinde
    • private readonly alanda
    Cevabı göster

    private readonly alanda — Doğru. Constructor injection'da bağımlılık private readonly alanda saklanır.

  3. Deseni davranışına eşle

    Constructor injection
    Yapıcıyla geçer
    Property injection
    Özellik ile geçer
    Method injection
    Metot parametresi
    Service locator
    Sınıf çeker

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