Lifetime: Scoped ve Transient
Scoped ve Transient lifetime'larını öğrenirsin.
Scoped ve Transient
Transient: her çözmede yeni bir örnek verilir. Hafif, durumsuz servisler için uygundur. Scoped: her kapsam için tek örnek verilir; web uygulamalarında genellikle bir istek bir kapsamdır.
Bir kapsamı provider.CreateScope() ile açarsın; aynı kapsamda yapılan çözümler aynı scoped örneği paylaşır. Farklı kapsamlar farklı scoped örnekler alır. Bu, istek başına tutarlı durum isteyen servisler için idealdir.
CreateScope
provider.CreateScope() yeni bir kapsam açar. Aynı kapsam içinde yapılan GetRequiredService çağrıları, scoped servisler için aynı örneği döndürür. Kapsam dispose edildiğinde, o kapsamdaki scoped örnekler de dispose edilir.
Web uygulamalarında her istek bir kapsamdır; istek bitince kapsam kapanır ve örnekler temizlenir. Bu, veri tabanı bağlamı gibi istek başına tutarlı kaynaklar için kritiktir. Console uygulamalarında kapsamları elle açıp kapatırsın.
Uygulama Transient: farklı örnekleri doğrula
Main içinde var services = new ServiceCollection(); ile kapsayıcı oluştur. services.AddTransient<Marker>(); ile Marker'ı transient kaydet. var provider = services.BuildServiceProvider(); ile sağlayıcı kur. var m1 = provider.GetRequiredService<Marker>(); ve var m2 = provider.GetRequiredService<Marker>(); ile iki kez çöz. m1.Id = 100; yapıp Console.WriteLine(m2.Id); ile yazdır.
Örnek çözümü göster
var services = new ServiceCollection(); services.AddTransient<Marker>(); var provider = services.BuildServiceProvider(); var m1 = provider.GetRequiredService<Marker>(); var m2 = provider.GetRequiredService<Marker>(); m1.Id = 100; Console.WriteLine(m2.Id);
Örnek çözüm:
using System;
using Microsoft.Extensions.DependencyInjection;
class Marker
{
public int Id { get; set; }
}
class Program
{
static void Main()
{
var services = new ServiceCollection();
services.AddTransient<Marker>();
var provider = services.BuildServiceProvider();
var m1 = provider.GetRequiredService<Marker>();
var m2 = provider.GetRequiredService<Marker>();
m1.Id = 100;
Console.WriteLine(m2.Id);
}
}
Kendini test et
-
Transient kaydını tamamla
services.Add____<ILogger, ConsoleLogger>();Cevabı göster
services.AddTransient<ILogger, ConsoleLogger>(); -
Transient her GetService çağrısında ne döndürür?
- Aynı örneği
- Yeni bir örnek
- Null
- Yalnızca statik bir örneği
Cevabı göster
Yeni bir örnek — Doğru. Transient her çağrıda yeni bir örnek döndürür.
-
Lifetime'ı kapsam davranışına eşle
- Transient
- Her çağrıda yeni
- Scoped
- Kapsamda tek
- Singleton
- Uygulamada tek
- CreateScope
- Yeni kapsam açar