Singleton tasarım deseni, bir sınıfın yalnızca bir örneğinin oluşturulmasını sağlar ve bu örneğe global erişim noktası sunar. Genellikle durum yönetimi, konfigürasyon bilgileri veya kaynak yönetimi gibi durumlarda kullanılır.
Singleton Deseninin Özellikleri:
- Tek bir örnek: Sınıfın yalnızca bir kez örneklenmesi sağlanır.
- Global erişim noktası: Sınıfın örneğine herhangi bir yerden erişilebilir.
- Lazy Initialization (Tembel Başlatma): Örnek yalnızca gerektiğinde oluşturulur.
Singleton Pattern .NET Core’da Nasıl Kullanılır?
.NET Core’da Singleton, genellikle Dependency Injection (DI) ile uygulanır. Bu sayede uygulamanın her yerinde aynı örnek kullanılabilir.
Örnek 1: Basit Singleton Uygulaması
Aşağıda klasik bir Singleton deseni örneği bulunmaktadır:
public class Singleton { private static Singleton _instance; private static readonly object _lock = new object(); // Private constructor: dışarıdan örnekleme yapılamaz. private Singleton() { // Özel başlatma işlemleri } // Tek bir örnek döner. public static Singleton Instance { get { if (_instance == null) { lock (_lock) { if (_instance == null) { _instance = new Singleton(); } } } return _instance; } } public void DoSomething() { Console.WriteLine("Singleton örneği çalışıyor."); } }
Kullanım ise şu şekildedir.
class Program { static void Main(string[] args) { Singleton instance1 = Singleton.Instance; Singleton instance2 = Singleton.Instance; Console.WriteLine(ReferenceEquals(instance1, instance2)); // true instance1.DoSomething(); } }
.NET Core Dependency Injection İle Singleton
.NET Core’da Singleton kullanımının en yaygın yolu DI kullanımıdır.
- Servis Tanımı:
public interface IMyService { void PrintMessage(); } public class MyService : IMyService { public void PrintMessage() { Console.WriteLine("Singleton servisi çalışıyor."); } }
- DI Konfigürasyonu:
Program.cs
veya Startup.cs
dosyasında Singleton olarak servis kaydı yapılır:
var builder = WebApplication.CreateBuilder(args); // Singleton servis kaydı builder.Services.AddSingleton<IMyService, MyService>(); var app = builder.Build(); // Middleware ile örnek kullanım app.MapGet("/", (IMyService myService) => { myService.PrintMessage(); return "Servis çalışıyor!"; }); app.Run();
Servis Kullanımı: Uygulamada bir yerde IMyService
kullanıldığında, aynı örnek geri döner.
https://medium.com/@ravipatel.it/understanding-the-singleton-design-pattern-in-c-fdb9ce04d795
https://refactoring.guru/design-patterns/singleton/csharp/example