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 ProductService2{3private DatabaseConnection _db;45public ProductService()6{7_db = new DatabaseConnection(); // Sıkı bağlantı (tight coupling)8}910public 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ç:
1public interface IDatabase2{3Product GetProduct(int id);4}56public class ProductService7{8private readonly IDatabase _db;910public ProductService(IDatabase db) // Bağımlılık dışarıdan gelir11{12_db = db;13}1415public 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:2122[kod]23var builder = WebApplicationBuilder.CreateBuilder(args);2425// Servisleri kaydet26builder.Services.AddScoped<IDatabase, DatabaseConnection>();27builder.Services.AddScoped<ProductService>();2829var app = builder.Build();3031app.MapGet("/product/{id}", (int id, ProductService service) =>32{33return service.GetProduct(id);34});3536app.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 ProductServiceTests2{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" });89var service = new ProductService(mockDb.Object);10var result = service.GetProduct(1);1112Assert.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.
0 yorum