Dependency Injection.NET'te: Temelden İleri Seviyelere

# Dependency Injection.NET'te: Temelden İleri Seviyelere

Dependency Injection (DI), bir sınıfın ihtiyaç duyduğu nesneleri dışarıdan almasını sağlayan tasarım desenidir. Sınıf, kendi bağımlılıklarını yaratmaz; başka bir mekanizma (IoC Container) onları sağlar. Bu, kodu daha esnek, test edilebilir ve bakımı kolay hale getirir.

Bir e-ticaret uygulamasında ürün hizmetini düşün. Sınıf içinde veritabanı bağlantısını doğrudan oluşturursan:

1public class ProductService
2{
3private DatabaseConnection _db;
4
5public ProductService()
6{
7_db = new DatabaseConnection(); // Sıkı bağlantı (tight coupling)
8}
9
10public Product GetProduct(int id)
11{
12return _db.Query($"SELECT * FROM Products WHERE Id = {id}");
13}
14}

Sorun: Testi zor, değişiklik maliyetli, mock nesneler kullanamıyorsun.

Bağımlılığı constructor parametresi olarak geç:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1public interface IDatabase
2{
3Product GetProduct(int id);
4}
5
6public class ProductService
7{
8private readonly IDatabase _db;
9
10public ProductService(IDatabase db) // Bağımlılık dışarıdan gelir
11{
12_db = db;
13}
14
15public Product GetProduct(int id)
16{
17return _db.GetProduct(id);
18}
19}
20[/kod].NET 6+ yerleşik DI container'ı kullanır. Program.cs'de servisleri kaydet:
21
22[kod]
23var builder = WebApplicationBuilder.CreateBuilder(args);
24
25// Servisleri kaydet
26builder.Services.AddScoped<IDatabase, DatabaseConnection>();
27builder.Services.AddScoped<ProductService>();
28
29var app = builder.Build();
30
31app.MapGet("/product/{id}", (int id, ProductService service) =>
32{
33return service.GetProduct(id);
34});
35
36app.Run();

Beklenen çıktı: Endpoint çağrıldığında ProductService otomatik olarak oluşturulur, IDatabase enjekte edilir.

- Transient: Her istek yeni örnek (test için ideal)
- Scoped: HTTP isteği başına bir örnek (web uygulamalarında standart)
- Singleton: Uygulama ömrü boyunca tek örnek (cache, logger)

1builder.Services.AddTransient<ILogger, Logger>();
2builder.Services.AddScoped<IRepository, Repository>();
3builder.Services.AddSingleton<ICache, MemoryCache>();

Mock nesnesi kolayca geçebilirsin:

1public class ProductServiceTests
2{
3[Fact]
4public void GetProduct_ReturnsMockData()
5{
6var mockDb = new Mock<IDatabase>();
7mockDb.Setup(x => x.GetProduct(1)).Returns(new Product { Id = 1, Name = "Test" });
8
9var service = new ProductService(mockDb.Object);
10var result = service.GetProduct(1);
11
12Assert.Equal("Test", result.Name);
13}
14}

Dependency Injection, sınıfları bağımsız hale getirerek kodu daha esnek ve test edilebilir yapar..NET'in yerleşik container'ı bunu kolaylaştırır. Constructor injection ile başla, lifetimes'ı doğru seç, ve testlerde mock nesneler kullan.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz