Hizmet Ömürleri: Geçici, Kapsamlı, Singleton
Transient, Scoped ve Singleton ömürlerinin nesne oluşturmayı, paylaşımını ve serbest bırakılmasını nasıl etkilediğini öğrenin.
Hizmet Ömürleri: Geçici, Kapsamlı, Singleton, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
Hizmet Ömürleri Neden Önemlidir
Hizmet ömrü, bir örneğin ne kadar süre yaşadığını ve kaç örnek oluşturulduğunu belirler. Yanlış ömrü seçmek, istekler arasında veri sızıntısı veya gereğinden fazla nesne oluşturulması gibi fark edilmesi zor hatalara yol açar.
Geçici: Her Seferinde Yeni
Geçici hizmetler, kapsayıcıdan her istendiğinde yeniden oluşturulur. Durum paylaşımının tehlikeli olabileceği hafif ve durumsuz hizmetler için bunları kullanın.
builder.Services.AddTransient<IEmailSender, SmtpEmailSender>();
// Each resolution creates a new instance:
// var a = sp.GetRequiredService<IEmailSender>(); // new
// var b = sp.GetRequiredService<IEmailSender>(); // new (different)Kapsamlı: İstek Başına Bir Kez
Kapsamlı hizmetler her kapsam için bir kez oluşturulur — ASP.NET Core'da bu genellikle bir HTTP isteğidir. Aynı örnek bir istek içinde paylaşılır, sonraki istek içinse yeni bir örnek oluşturulur.
builder.Services.AddScoped<AppDbContext>();
// Within a single HTTP request:
// Both resolve to the SAME AppDbContext instance
// -> consistent unit of work across the requestTekil: Uygulama Ömrü Boyunca Bir Tane
Tekil hizmetler bir kez oluşturulur ve uygulamanın tüm ömrü boyunca yeniden kullanılır. Yapılandırma önbellekleri gibi oluşturulması maliyetli ve iş parçacığı açısından güvenli hizmetler için bunları kullanın.
builder.Services.AddSingleton<IMemoryCache, MemoryCache>();
// Or register a pre-built instance:
var config = new AppConfig { MaxRetries = 3 };
builder.Services.AddSingleton<IAppConfig>(config);Üçünü Birden Karşılaştırma
Hızlı bir yan yana karşılaştırma:
- Geçici — her istekte yeni örnek; durumsuz yardımcılar
- Kapsamlı — HTTP isteği başına bir örnek; DbContext, İş Birimi
- Tekil — uygulama ömrü boyunca bir örnek; önbellekler, yapılandırmalar
Tutsak Bağımlılık Sorunu
Bir Kapsamlı veya Geçici hizmeti bir Tekil hizmete eklemek yaygın bir hatadır. Tekil hizmet, kısa ömürlü hizmete bir başvuru tutarak onun gereğinden uzun süre yaşamasına neden olur.
// BAD: Singleton captures a Scoped service
public class MySingleton
{
private readonly AppDbContext _db; // Scoped!
public MySingleton(AppDbContext db) => _db = db;
// _db is now stuck alive for the app's lifetime
}Kapsam İhlallerini Algılama
Bir tutsak bağımlılık algılandığında kapsayıcının başlangıçta hata vermesi için ValidateScopes özelliğini etkinleştirin. Bu sayede hatalar üretim ortamında veri sorunlarına yol açmadan önce yakalanır.
builder.Host.UseDefaultServiceProvider(options =>
{
options.ValidateScopes = true; // detect captive deps
options.ValidateOnBuild = true; // fail fast at start
});İstek Dışında Kapsamlı Hizmetler
Bir arka plan görevinde Kapsamlı hizmetleri çözümlemek için IServiceScopeFactory kullanarak açık bir kapsam oluşturun. Kapsamlı hizmetleri hiçbir zaman doğrudan kök kapsayıcıdan çözümlemeyin.
public class MyWorker : BackgroundService
{
private readonly IServiceScopeFactory _factory;
public MyWorker(IServiceScopeFactory factory) => _factory = factory;
protected override async Task ExecuteAsync(CancellationToken ct)
{
using var scope = _factory.CreateScope();
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
await db.Users.ToListAsync(ct);
}
}Geçici IDisposable Hizmetleri
Kök kapsayıcıdan çözümlenen geçici IDisposable hizmetleri, kapsayıcı serbest bırakılana kadar (uygulama kapanana kadar) izlenir. Kaynakları gecikmeden serbest bırakmak için bunları bir kapsam içinde çözümleyin.
// Correctly scoped transient disposable
using var scope = sp.CreateScope();
var svc = scope.ServiceProvider.GetRequiredService<MyDisposableService>();
await svc.DoWorkAsync();
// svc.Dispose() called when scope is disposedDoğru Hizmet Ömrünü Seçme
Basit bir karar rehberi:
- Hizmet durumsuz mu? → Geçici
- Bir isteğe (örneğin kullanıcı kimliğine veya DbContext'e) bağlı mı? → Kapsamlı
- İş parçacığı açısından güvenli ve oluşturulması maliyetli mi? → Tekil
Gerçek Dünya: Üç Ömrü Bir Arada Kullanma
Tipik bir web API'si, doğruluk ve performans için farklı hizmetleri uygun ömürlerle kaydeder.
builder.Services.AddSingleton<IConfiguration>(builder.Configuration);
builder.Services.AddSingleton<ICacheService, RedisCacheService>();
builder.Services.AddScoped<AppDbContext>();
builder.Services.AddScoped<IOrderRepository, OrderRepository>();
builder.Services.AddScoped<OrderService>();
builder.Services.AddTransient<IEmailSender, SendGridEmailSender>();Hızlı Kontrol
Bir Tekil hizmet, Kapsamlı bir hizmete başvuru tuttuğunda hangi sorun ortaya çıkar?
Özet: Hizmet Ömürleri
Temel çıkarımlar:
- Geçici: her seferinde yeni örnek — durumsuz ve hafif hizmetler için uygundur
- Kapsamlı: istek başına bir örnek — DbContext, depolar, iş birimi
- Tekil: sonsuza kadar bir örnek — önbellekler, yapılandırmalar, iş parçacığı açısından güvenli yardımcılar
- Kısa ömürlü hizmetleri hiçbir zaman daha uzun ömürlü hizmetlere eklemeyin (tutsak bağımlılık)
- Arka plan görevlerinde Kapsamlı hizmetleri çözümlemek için
IServiceScopeFactorykullanın
Sıkça Sorulan Sorular
“Hizmet Ömürleri: Geçici, Kapsamlı, Singleton” dersi ücretsiz mi?
Evet — “Hizmet Ömürleri: Geçici, Kapsamlı, Singleton” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Hizmet Ömürleri: Geçici, Kapsamlı, Singleton” dersinde ne öğreneceğim?
Transient, Scoped ve Singleton ömürlerinin nesne oluşturmayı, paylaşımını ve serbest bırakılmasını nasıl etkilediğini öğrenin. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Hizmet Ömürleri: Geçici, Kapsamlı, Singleton” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- DI Kapsayıcılarının Temelleri
- Hizmet Ömürleri: Geçici, Kapsamlı, Singleton
- Kurucu Enjeksiyonu ve Arayüzler
- Fabrika ve Seçenekler Desenleri