Middle
ASP.NET Core'da Bağımlılık Enjeksiyonu (DI) nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Bağımlılık Enjeksiyonu (DI), kontrolün tersine çevrilmesi (IoC) için tasarım desenidir ve zayıf bağlı kodlar oluşturmayı sağlar. ASP.NET Core'da DI, sınıflar arasındaki bağımlılıkları kolayca yönetmeyi sağlayan yerleşik bir özelliktir.
ASP.NET Core'daki DI'nin temel bileşenleri:
- Servisler: İşlevsellik sağlayan nesneler (örneğin, depo sınıfları, günlük kaydı servisleri).
- DI konteyneri: Bağımlılıkları çözen ve servis örnekleri oluşturan nesne.
- Servislerin yaşam döngüsü: Ne zaman ve nasıl servis örneklerinin oluşturulacağını belirler:
- Transient: Her servis isteğinde yeni bir örnek oluşturulur.
- Scoped: Her istek için bir örnek (web uygulamaları için her HTTP isteği).
- Singleton: İlk istekte oluşturulur ve uygulama boyunca kullanılır.
DI kullanmanın avantajları:
- Zayıf bağlılık: Sınıflar, somut uygulamalardan çok soyutlamalara (arayüzlere) bağlıdır.
- Test edilebilirlik: Gerçek bağımlılıkları "mocks" veya "stubs" ile kolayca değiştirebilirsiniz.
- Genişletilebilirlik: Bağımlı kodu değiştirmeden servis uygulamalarını kolayca değiştirebilirsiniz.
- Bağımlılıkların yönetimi: DI konteyneri yaşam döngüsünü ve nesne oluşturmayı yönetir.
Startup.cs (veya .NET 6+ Program.cs) içinde servislerin kaydedilmesine örnek:
// ConfigureServices metodunda
public void ConfigureServices(IServiceCollection services)
{
// Singleton yaşam döngüsü ile servis kaydı
services.AddSingleton<ILogger, EmailLogger>();
// Scoped yaşam döngüsü ile servis kaydı
services.AddScoped<IDataRepository, SqlDataRepository>();
// Transient yaşam döngüsü ile servis kaydı
services.AddTransient<ITransientService, TransientService>();
// Bağımlılık enjeksiyonu için denetleyicilerin kaydı
services.AddControllersWithViews();
}
Denetleyici yapıcısında bağımlılık enjeksiyonu:
```csharp
public class HomeController : Controller
{
private readonly ILogger _logger;
private readonly IDataRepository _repository;
// ASP.NET Core DI bu bağımlılıkları otomatik çözümler ve enjekte eder
public HomeController(ILogger logger, IDataRepository repository)
{
_logger = logger;
_repository = repository;
}
// ... denetleyici eylemleri
}