CodeBlanks Logo Icon CodeBlanks

Lifetime: Singleton

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

Singleton lifetime ile tek örnek hizmetleri öğrenirsin.

Singleton lifetime

AddSingleton<T>() kaydı, uygulam boyunca tek bir örnek üretir. Aynı servisi birden çok kez çözdüğünde her seferinde aynı örnek gelir. Bu, paylaşılan durum tutan servisler için uygundur.

Singleton örnekler, kapsayıcı ömrü boyunca yaşar. Bu yüzden eşzamanlı erişime karşı güvenli olmalıdır. Yapılandırma, önbellek ve genel durum servisleri genellikle singleton kayıt edilir.

Thread safety

Singleton örnekler eşzamanlı erişime karşı güvenli olmalıdır. Kapsayıcı örneği tembel olarak bir kez üretir; aynı örneğe eşzamanlı erişen iş parçacıkları yarış durumuna düşebilir. Bu yüzden durum değişiklikleri lock veya eşzamanlı koleksiyonlarla korunur.

Yalnızca okunan yapılandırma servisleri için ek senkronizasyona gerek olmayabilir. Ancak sayacını artıran bir servis gibi durum değiştiren her Singleton, kilitleme gerektirir.

Uygulama Singleton: aynı örneği doğrula

Main içinde var services = new ServiceCollection(); ile kapsayıcı oluştur. services.AddSingleton<Counter>(); ile Counter'ı singleton kaydet. var provider = services.BuildServiceProvider(); ile sağlayıcı kur. var c1 = provider.GetRequiredService<Counter>(); ve var c2 = provider.GetRequiredService<Counter>(); ile iki kez çöz. c1.Count = 5; yapıp Console.WriteLine(c2.Count); ile yazdır.

Örnek çözümü göster
var services = new ServiceCollection(); services.AddSingleton<Counter>(); var provider = services.BuildServiceProvider(); var c1 = provider.GetRequiredService<Counter>(); var c2 = provider.GetRequiredService<Counter>(); c1.Count = 5; Console.WriteLine(c2.Count);
Örnek çözüm:
using System;
using Microsoft.Extensions.DependencyInjection;

class Counter
{
    public int Count { get; set; }
}

class Program
{
    static void Main()
    {
        var services = new ServiceCollection();
        services.AddSingleton<Counter>();
        var provider = services.BuildServiceProvider();
        var c1 = provider.GetRequiredService<Counter>();
        var c2 = provider.GetRequiredService<Counter>();
        c1.Count = 5;
        Console.WriteLine(c2.Count);
    }
}

Kendini test et

  1. AddSingleton ne zaman kullanılır?

    • Her istekte yeni örnek gerektiğinde
    • Her kapsam için ayrı örnek gerektiğinde
    • Uygulama boyunca tek örnek paylaşıldığında
    • Yalnızca hata ayıklama için
    Cevabı göster

    Uygulama boyunca tek örnek paylaşıldığında — Doğru. AddSingleton uygulama boyunca tek örnek paylaşmak için kullanılır.

  2. Singleton kaydını tamamla

    services.Add____<Counter, Counter>();
    Cevabı göster
    services.AddSingleton<Counter, Counter>();
  3. Lifetime'ı davranışına eşle

    Singleton
    Tek örnek
    Scoped
    Kapsam başına
    Transient
    Her seferinde yeni
    AddSingleton
    Kayıt metodu

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