ASP.NET Core'da Dependency Injection Nasıl Çalışır?
ASP.NET Core'un en güçlü özelliklerinden biri, Dependency Injection (DI) konteynerinin framework'ün içine entegre edilmiş olmasıdır. Bu sayede bağımlılıkları merkezi bir yerden yönetebilir ve test edilebilir kod yazabilirsiniz.
Bir sınıf başka bir sınıfa ihtiyaç duyduğunda, o sınıfı içinde oluşturmak yerine dışarıdan alması daha iyi bir yaklaşımdır. Bu sayede sınıflar birbirinden bağımsız hale gelir ve değişiklik yapması kolaylaşır.
Service Registration: Startup.cs veya Program.cs dosyasında servisleri DI konteynerine kaydedersiniz. Service Lifetime ise üç türde olur: Transient (her istek için yeni instance), Scoped (istek başına bir instance) ve Singleton (uygulama ömrü boyunca bir instance).
Önce bir interface ve implementasyon yazalım:
1public interface IEmailService2{3Task SendEmailAsync(string to, string message);4}56public class EmailService: IEmailService7{8public Task SendEmailAsync(string to, string message)9{10// Email gönderme işlemi11Console.WriteLine($"Email gönderildi: {to}");12return Task.CompletedTask;13}14}Şimdi Program.cs'de servisi kaydedelim:
1var builder = WebApplication.CreateBuilder(args);23// DI konteynerine servisi ekle4builder.Services.AddScoped<IEmailService, EmailService>();56var app = builder.Build();Controller'da kullanımı:
1public class UserController: ControllerBase2{3private readonly IEmailService _emailService;45// DI konteyner otomatik olarak IEmailService'i inject eder6public UserController(IEmailService emailService)7{8_emailService = emailService;9}1011[HttpPost]12public async Task<IActionResult> Register(string email)13{14await _emailService.SendEmailAsync(email, "Hoşgeldiniz!");15return Ok();16}17}Transient: Stateless servislerde (örneğin logger). Her çağrıda yeni instance oluşturulur.
Scoped: Veritabanı bağlantıları, DbContext. HTTP isteği boyunca aynı instance kullanılır.
Singleton: Konfigürasyon, cache servisleri. Uygulama hayatı boyunca tek instance.
DI, ASP.NET Core uygulamalarını daha temiz, test edilebilir ve bakımı kolay hale getiren temel bir mekanizmadır. Doğru lifetime seçimi performans ve bellek yönetimi açısından kritik önem taşır.
5 yorum
o zaman her test için gerçek veritabanıyla çalışmak zorunda kalıyordun herhalde çok yavaş
aynen ya test etmek de çok zordu eskiden mock filan yapamıyordun gerçek nesneyle çalışmak
aynen şimdi bi de değiştirmek lazım gelirse bir yerde bütün kodu çevirmen gerekiyordu
eskiden böyle rahat değildi ya her sınıfın içinde kendisi oluşturması gerekiyordu
ya işte o yüzden şimdi bu DI şeyi çok iyi geldi mocklar sayesinde gerçek veritabanı