M E D Y A T Ö R

.NET Core MVC Bağımlılık Yönetimi: AddTransient, AddScoped, AddSingleton Arasındaki Fark Nedir?

14

KASIM

2024


Görüntülenme

   .NET Core MVC geliştirme sürecinde, bağımlılık yönetimi (DI “Dependency Injection”) yazılımın esnekliği, performansı ve sürdürülebilirliği açısından çok önemli bir rol oynar. Bağımlılıkların verimli bir şekilde yönetilmesi, uygulamamızın daha okunabilir olmasını sağlar. Peki, AddTransient, AddScoped ve AddSingleton nedir ve nasıl çalışır? Aralarındaki farkları anlamak, uygulamanızda hangi bağımlılık yaşam süresini tercih etmeniz gerektiği konusunda yol gösterici olacaktır.


Bağımlılık Enjeksiyonu ve Bağımlılık Yönetiminin Amacı


Bağımlılık Enjeksiyonu ve Bağımlılık Yönetiminin Amacı

Bağımlılık Enjeksiyonu, kısaca DI (Dependency Injection), bir sınıfın bağımlı olduğu nesneleri dışarıdan alması anlamına gelir. Bu yaklaşım, sınıfların doğrudan birbirlerine bağlı olmasını engelleyerek esneklik sağlar. Örneğin, bir e-ticaret uygulamasında “Sipariş” sınıfının, “Ürün” sınıfına bağımlı olduğunu düşünelim. Bağımlılık Enjeksiyonu, “Sipariş” sınıfının “Ürün” sınıfını doğrudan oluşturmak yerine, dışarıdan enjekte edilmesini sağlar. Bu da uygulamanın yönetilebilirliğini artırır. .NET Core MVC içinde bağımlılık enjeksiyonunu yönetmek için AddTransient, AddScoped ve AddSingleton gibi yöntemler kullanılır. Her bir yöntem, bağımlılığın ömrünü yani yaşam süresini farklı bir yaklaşımla ele alır.



Bağımlılık Enjeksiyonu ve Bağımlılık Yönetiminin Amacı


AddTransient, AddScoped ve AddSingleton Arasındaki Farklar

1. AddTransient


AddTransient, AddScoped ve AddSingleton Arasındaki Farklar


AddTransient, bağımlılığı her talepte yeni bir nesne olarak oluşturur. Yani bu yaşam süresi, nesnenin her kullanımında bir kopyasını sağlar. Bu özellik kısa ömürlü nesneler ve bağımsız görevlerde idealdir.
Örnek:
        services.AddTransient<IEmailService, EmailService>();


Bu kod, IEmailService talep edildiğinde her seferinde yeni bir EmailService nesnesi oluşturur. Örneğin, bir e-posta gönderme işlemini her seferinde baştan başlatmak istiyorsanız AddTransient mantıklı olacaktır.

2. AddScoped

2.	AddScoped


AddScoped ise nesneyi her HTTP isteğinde bir kez oluşturur ve o istek süresince aynı nesne kullanılır. Yani, aynı istek içinde AddScoped olarak belirtilen nesneler yalnızca bir kez oluşturulur, ancak bir başka istek geldiğinde yeniden bir nesne örneği yaratılır.
Örnek:



        services.AddScoped<IOrderService, OrderService>();



Burada IOrderService için aynı HTTP isteği boyunca tek bir OrderService nesnesi kullanılır. Bu özellik, kullanıcı işlemleri gibi yalnızca bir oturum veya istekte kullanılması gereken veriler için idealdir.

3. AddSingleton


3.	AddSingleton


AddSingleton, uygulama başlatıldığında yalnızca bir kez nesne oluşturur ve tüm isteklerde aynı nesneyi kullanır. Bu, uzun süreli veya tüm kullanıcılar arasında paylaşılan veriler için en iyi seçimdir.
Örnek:

        services.AddSingleton<ILoggingService, LoggingService>();
 

Burada ILoggingService nesnesi uygulamanın ömrü boyunca yalnızca bir kez oluşturulur. Bu yaklaşım, uygulama genelinde kullanılacak loglama, konfigürasyon ayarları veya cache gibi veriler için uygundur.

Hangi Yaşam Süresini Seçmeliyiz?

  1. 1. AddTransient: Kısa ömürlü nesneler için idealdir. Hafif ve bağımsız görevler için kullanın.
  2. 2. AddScoped: Kullanıcı başına veya istek başına işlem gerektiren görevlerde en uygun tercih. Örneğin, kullanıcıya özel veri işleme.
  3. 3. AddSingleton: Uygulama boyunca paylaşılan veriler veya sabit veriler için en iyi seçim.
  4. Sipariş Yönetimi (OrderService): Sipariş yönetimi için AddScoped tercih edilebilir, çünkü sipariş işlemleri kullanıcı başına özeldir.
  5. Kullanıcı Kimlik Doğrulama (UserAuthenticationService): Bu tür işlemler AddTransient ile daha esnek olur, çünkü her oturum için kullanıcı doğrulama yenilenir.
  6. Log Kayıtları (LoggingService): Tüm kullanıcılar arasında paylaşılan bir servis olduğundan AddSingleton kullanmak mantıklıdır.
  7. AddTransient çok sık kullanılırsa, her talep yeni bir nesne oluşturacağından fazla bellek tüketebilir.
  8. AddScoped doğru kullanıldığında, aynı istek içinde tekrar eden nesneleri yeniden oluşturmaktan kaçınarak performansı iyileştirir.
  9. AddSingleton uzun süreli nesneler için bellekten tasarruf sağlar, ancak her işlemde aynı nesnenin kullanılması gerektiğinden, yalnızca güvenli işlemler için kullanılmalıdır.

Hangi Yaşam Süresini Seçmeliyiz?

Pratik Bir Örnek Üzerinden İnceleyelim

Bir e-ticaret uygulaması üzerinde çalıştığınızı düşünelim. Siparişlerin yönetimi, kullanıcı işlemleri ve log kayıtları gibi işlemleri nasıl yöneteceğinizi planlamanız gerekiyor:

Bu stratejiyle hem performansı artırabilir hem de verilerin güvenliğini ve kullanılabilirliğini optimize edebilirsiniz.

Bağımlılık Yönetiminin Performansa Etkisi

Herhangi bir uygulamada bellek kullanımı ve işlem performansı, özellikle büyük ölçekli projelerde son derece önemlidir. Doğru yaşam süresini seçmek, performansı doğrudan etkiler:

Hangi Yaşam Süresini Seçmeliyiz?

.NET Core MVC’de AddTransient, AddScoped ve AddSingleton ile bağımlılık yönetimi, projenizin performansını, sürdürülebilirliğini ve güvenliğini artırmada kilit bir rol oynar. Her bir yaşam süresinin kullanım amacını iyi kavrayarak uygulamanızda daha verimli bir yapı kurabilirsiniz. Kısa ömürlü görevler için AddTransient, kullanıcı başına işlem gerektiren işlemler için AddScoped ve uygulama genelinde paylaşılan nesneler için AddSingleton doğru seçimlerdir.