5 Aralık 2022 Pazartesi

ASP.NET Core Derinlemesine Dependency Injection

 Dependency Injection, Bir sınıfın bağımlı olduğu sınıfların, bu sınıf içine dışarıdan enjekte edilme işlemidir. Temel amaç somut sınıflara olan bağımlılığı ortadan kaldırmak ve test edilebilirliği kolaylaştırmaktır.



Bir servis DataServiceye bağımlıysa direkt olarak DataServicenin kendisine bağımlıdır. Bunun gibi servisleri test etmek zor olabilir . Bunun yerine servisimiz IDataServiceye bağlıysa sadece inteface tarafından sağlanan contractlar önemsenir. Hangi uygulamanın implemente edildiğinin bir önemi kalmaz. Servisin davranışını test etmek için IDataServicenin Mockunu kullanabiliriz.

Service Lifetime 

Singleton, Yalnızca tek bir instancenin oluşturulacağı anlamına gelir. Bu instance, kendisine ihtiyaç duyan tüm componenentler tarafından ortak kullanılır.  Böylece hep aynı nesne kullanılmış olur.

Scoped, Uygulamaya yapılan her request için bir intance oluşturulur. Ve bu request için response dönene kadar hep aynı instance kullanılır. Request sonlanana kadar ihtiyaç duyulan  her constructer içerisine aynı nesne injecte edilir.

Transient, Her zaman yeni bir instance oluşturulur. Bir request boyunca her constructerda yeni bir instance oluştururlur.

Not: Bir Component Lifetime süresi kendinden kısa olan bir componente bağımlı olamaz. Örneğin singleton A servisinin construterında scoped bir B servisine bağımlı olamaz.


Implementation factories



DataService nesnesini, IOtherService componentini kullanarak oluşturmak istesek yukarıdaki gibi yapabiliriz.

GetRequiredService<T> yerine GetService<T> de  kullanabiliriz. İkisi arasındaki fark GetRequirdeService de eğer nesne bulunamazsa geriye null döner. fakat GetService bulamazsa geriye InvalidOperationException  exception fırlatır.


Decorator Pattern Configuration





Yukarıdaki UML'e baktığımızda decorator kalıbı kullanılmıştır. IDataService interfacesi DataService sınıfı tarafından implemente edilmiştir. DataService sınıfına run-time da yeni bir özellik eklemek istediğimizde decorator tasarım kalıbını kullanabiliriz. Bu yeni özelliği IDataServiceyi implemente eden CacheDataService sınıfı içerisinde yapacağız. 






Yada aşağıdaki gibi Scrutor kullanarak yapabiliriz.
Package Managert consoldan   NuGet\Install-Package Scrutor  indirilir.




Generic Yapıları Register Etme




Hiç yorum yok:

Yorum Gönder