ASP.NET Core DI'da Transient, Scoped ve Singleton lifetime'ları arasındaki fark nedir? Captive dependency nedir?
Cevap
| Lifetime | Örnek ne zaman oluşur | Tipik kullanım |
|---|---|---|
| Transient | Her çözümlemede (resolve) yeni örnek | Hafif, stateless servisler |
| Scoped | HTTP isteği (scope) başına bir örnek | DbContext, unit of work, istek bağlamı |
| Singleton | Uygulama ömrü boyunca tek örnek | Cache, konfigürasyon, HttpClient factory, thread-safe servisler |
builder.Services.AddTransient<IEmailFormatter, EmailFormatter>();
builder.Services.AddScoped<IOrderService, OrderService>();
builder.Services.AddDbContext<AppDbContext>(o => o.UseNpgsql(cs)); // Scoped
builder.Services.AddSingleton<IClock, SystemClock>();Captive dependency
Uzun ömürlü bir servisin daha kısa ömürlü bir servisi constructor'da alıp ömrünü uzatmasıdır. En yaygın hata: Singleton içine Scoped DbContext inject etmek. DbContext tüm istekler tarafından paylaşılır; thread-safe olmadığı için eşzamanlı isteklerde hata verir ve change tracker sonsuza kadar büyür.
Development ortamında ASP.NET Core ValidateScopes ile bunu yakalar: Cannot consume scoped service from singleton.
Singleton'dan scoped servis kullanmak gerekirse
public class CleanupWorker(IServiceScopeFactory scopeFactory) : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
using var scope = scopeFactory.CreateScope();
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
await db.Sessions.Where(s => s.Expired).ExecuteDeleteAsync(ct);
await Task.Delay(TimeSpan.FromMinutes(5), ct);
}
}
}Kurallar
- Bir servis, kendisinden kısa ömürlü bağımlılık almamalı.
- Singleton'lar thread-safe olmalı.
IDisposabletransient servisler container tarafından scope sonunda dispose edilir; root scope'tan çözülürse uygulama kapanana kadar bellekte kalır.
İlgili C# & .NET soruları
- .NET'te Garbage Collector nasıl çalışır? Generation'lar, Large Object Heap ve IDisposable ilişkisini açıklayın.
- EF Core'da change tracking nasıl çalışır? AsNoTracking ne zaman kullanılır ve N+1 problemi nasıl önlenir?
- IEnumerable<T> ile IQueryable<T> arasındaki fark nedir? EF Core'da yanlış kullanım ne gibi sorunlara yol açar?
- LINQ'te deferred execution nedir? Aşağıdaki kodun çıktısı ne olur?
- async/await kullanırken .Result veya .Wait() çağırmak neden deadlock'a yol açabilir? ConfigureAwait(false) ne işe yarar?
- ASP.NET Core'da middleware pipeline nasıl çalışır? Use, Run ve Map farkı nedir, sıralama neden önemlidir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.