
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.

AddTransient, AddScoped ve AddSingleton Arasındaki Farklar
1. AddTransient
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

services.AddScoped<IOrderService, OrderService>(); |
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. AddTransient: Kısa ömürlü nesneler için idealdir. Hafif ve bağımsız görevler için kullanın.
- 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. AddSingleton: Uygulama boyunca paylaşılan veriler veya sabit veriler için en iyi seçim.
- • Sipariş Yönetimi (OrderService): Sipariş yönetimi için AddScoped tercih edilebilir, çünkü sipariş işlemleri kullanıcı başına özeldir.
- • 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.
- • Log Kayıtları (LoggingService): Tüm kullanıcılar arasında paylaşılan bir servis olduğundan AddSingleton kullanmak mantıklıdır.
- • AddTransient çok sık kullanılırsa, her talep yeni bir nesne oluşturacağından fazla bellek tüketebilir.
- • AddScoped doğru kullanıldığında, aynı istek içinde tekrar eden nesneleri yeniden oluşturmaktan kaçınarak performansı iyileştirir.
- • 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.

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:

.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.

