C#
Constructor injection
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
-
Yapıcı parametresini tamamla
public Service(ILogger ____) { _logger = logger; }
Cevabı göster
public Service(ILogger logger) { _logger = logger; }
-
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.
-
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
Sıradaki ders: ServiceCollection