ASP.NET Core DI'da Transient, Scoped ve Singleton lifetime'ları arasındaki fark nedir? Captive dependency nedir?

Cevap

LifetimeÖrnek ne zaman oluşurTipik kullanım
TransientHer çözümlemede (resolve) yeni örnekHafif, stateless servisler
ScopedHTTP isteği (scope) başına bir örnekDbContext, unit of work, istek bağlamı
SingletonUygulama ömrü boyunca tek örnekCache, 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ı.
  • IDisposable transient servisler container tarafından scope sonunda dispose edilir; root scope'tan çözülürse uygulama kapanana kadar bellekte kalır.
  1. .NET'te Garbage Collector nasıl çalışır? Generation'lar, Large Object Heap ve IDisposable ilişkisini açıklayın.ZorC# & .NETBackend
  2. EF Core'da change tracking nasıl çalışır? AsNoTracking ne zaman kullanılır ve N+1 problemi nasıl önlenir?OrtaC# & .NETBackend
  3. IEnumerable<T> ile IQueryable<T> arasındaki fark nedir? EF Core'da yanlış kullanım ne gibi sorunlara yol açar?KolayC# & .NETBackend
  4. LINQ'te deferred execution nedir? Aşağıdaki kodun çıktısı ne olur?OrtaC# & .NETBackend
  5. async/await kullanırken .Result veya .Wait() çağırmak neden deadlock'a yol açabilir? ConfigureAwait(false) ne işe yarar?ZorC# & .NETBackend
  6. ASP.NET Core'da middleware pipeline nasıl çalışır? Use, Run ve Map farkı nedir, sıralama neden önemlidir?OrtaC# & .NETBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle