.Net 8 Ioc, Dependecy Injection ve KeyedServices

.Net ve nesne yönelimli programlama dünyasında IoC (inversion of control) ve dependecy injection çok önemli bir yer tutar. Nasıl çalıştığı ne anlama geldiğini, .net 8 ile gelen yeni di özelliklerini ve scope, transient, singleton arasındaki farkları bu gönderide örneklerle beraber inceleyeceğiz.

IoC (Inversion of Control) Nedir?

IoC bir tasarım prensibidir. Nesne yönelimli tasarımları birbirine sıkı sıkıya bağlı olmamasını sağlar. Kısa bir örnekle açıklarsak bir aracınız var ve sürdüğünüzü düşünelim, tamamen kontrol sizde. Ioc prensibine göre ise araç yerine taksiye binmeniz ve sizin sürmemeniz gerekir sadece yolu tarif etmeniz yeterlidir böylece bir araca sıkı sıkıya bağımlı olmamış oluruz.
Aynı şekilde objelerimizi de iş akışlarına çok sıkı sıkıya bağlı olmasını istemeyiz. Bunun yerine daha esnek bir yapı tercih etmeliyiz, böylece daha kontrol edilebilir bir yapı olur.

Dependecy Injection Nedir?

Yazılım geliştirme sürecinde kullanılan bir tasarım desenidir. Bu desen, bir sınıfın başka bir sınıfa olan bağımlılığını azaltır ve yönetmek için kullanılır. Araba’nın temel özellikleri sürüş ve park olsun, ben iş süreçlerimde araba sınıfını referans alarak kullanayım arabayı hangi nesneye (bmw, mercedes vb.) bağlamışsam onu kullanmış olurum. Büyük resimden sürüş ve park özellikleri olan bir arabayı kullanmışımdır biri daha hızlı gider biri daha iyi park eder sadece performansı değişir.

.Net 8.0 Dependecy Injection

.net core’dan beri temel 3 tane di yöntemi var. AddScoped, AddTransient, ve AddSingleton. .net 8 ile AddKeyedScoped, AddKeyedTransient ve AddKeyedSingleton tipleri de eklendi. Şimdi bu yöntemler nasıl ve neden kullanılıyor örneklerle inceleyeceğiz. Önce temel olarak bir kaç sınıf tasarlayalım.

iki tane de bu interface’den türeyen sınıf olsun

AddScoped ile bağlayalım

İlk çağrı atılır atılmaz .net bir scope oluşturur. FileStorage nesnesini ve constrcutor injection ile tanımladığımız sınıfların örneğini oluşturur ve request bitene kadar oluşturduğu örneği kullanır.
GetName() bu durumda atanmış değeri getirir.
GetName2() ise yeni scope açar ve eski veriyi getirir.

AddTransient

Sınıfı her çağırdığında yeni bir örnek oluşturur. Yukarıdaki aynı örneği test ettiğimiz zaman GetName() ve GetName2() de eski değeri getirdiği sonucunu görürüz.

AddSingleton

Singleton uygulama ayağa kalktığında sınıfı oluşturur. istek bitse bile bellekte fonksiyon saklanır.

yeni bir request daha ekleyelim

Önce new name ataması yapan isteği gerçekleştirelim. Daha sonra da file/test adresine istek atalım. Sonuç new name olacaktır yani güncellenmiş değeri gösterecektir.

Key ile Dependecy Injection

.net 8 ile gelen yeni özelliklerdir bir interface’i birden çok sınıfa bağlama imkanı sunar. Sadece scope değil aynı şekilde transient ve singleton da kullanılabilir.

Kullanımı:

FromKeyedServices attribute ile kayıt ettiğimiz keyi parametre olarak vererek servisleri çağırabiliriz.

Scope, Transient ve Singleton ne zaman kullanılmalı?

Örneğin ef core kullandığımız düşünelim bir post işlemi başlattık ve context üzerinden bir veri çağırarak transcationı başlattık bu transaction üzerindeki her değişiklik context üzerinde saklanacaktır transaction bitene kadar yani commit işlemi yapılana kadar değişiklikler üzerinde işlem yaparız. Context’i transient olarak kaydettiğimiz durumda aynı istek içinde farklı bir servisde contexti çağırdığımız zaman yeni bir context oluşturacaktır ve contextleri çoklayacaktır. Bu durumda en ideali scope’dur.
İhtiyaçlarınıza göre bu yöntemleri seçebilirsiniz.

Başka bir gönderide görüşmek üzere esen kalın 🙂

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

Turkish