CodeBlanks Logo Icon CodeBlanks

Lifetime: Scoped ve Transient

C# kursu · İleri seviye · Ders 59/83

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

  1. Transient kaydını tamamla

    services.Add____<ILogger, ConsoleLogger>();
    Cevabı göster
    services.AddTransient<ILogger, ConsoleLogger>();
  2. 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.

  3. Lifetime'ı kapsam davranışına eşle

    Transient
    Her çağrıda yeni
    Scoped
    Kapsamda tek
    Singleton
    Uygulamada tek
    CreateScope
    Yeni kapsam açar

İleri seviye bölümündeki tüm dersler