PostSharp 2027.0'da aspect'ler servisleri constructor injection ile alabiliyor
PostSharp 2027.0, aspect'lerin dependency injection container'ından servis istemesine izin veriyor. Derleme sırasında bu servisler, geliştirilen sınıfın constructor parametrelerine eklenir; böylece global service locator kullanmaya gerek kalmaz. Eski kod kademeli olarak taşınabilir ve PostSharp Caching cache backend'ini container'dan alabilir.
Kilit noktalar
- Servis istemek için IAdviceProvider.ProvideAdvices içinden ImportDependencyAdviceInstance döndürün.
- Opsiyonel servis için IsRequired = false, ilk kullanımda çözülmesi için IsLazy = true kullanın.
- Derleme constructor parametrelerini ekler; özgün imza protected internal bir forwarder olur.
- new ile oluşturulan nesneler RunTimeServiceLocator'a düşer; bu servisleri başlangıçta kaydedin.
- [CacheConfiguration] üzerinde UseDependencyInjection açarak ICachingService'i container'dan alın.
- Özellik PostSharp 2027.0.6-preview sürümünden itibaren mevcut.
PostSharp aspect'lerini dependency injection ile birlikte kullanmak uzun süre zordu: derleme zamanında oluşturulup statik olarak saklandıkları için constructor tabanlı container'lar onlara servis veremiyordu. PostSharp 2027.0 bu boşluğu kapatıyor. Bir aspect, IAdviceProvider üzerinden ImportDependencyAdviceInstance döndürerek servis isteyebiliyor ve derleme, hedef sınıfın constructor'ına karşılık gelen bir parametre ekliyor. Servisler zorunlu, opsiyonel veya lazy olabilir.
Sınıf bağımlılıklarını her zamanki gibi tanımlar, servisleri ise container kaydeder. Hâlâ new ile nesne oluşturan kod bu parametreler için null alır ve süreç genelinde çalışan RunTimeServiceLocator'a düşer; böylece geçiş adım adım yapılabilir. PostSharp Caching aynı mekanizmayı UseDependencyInjection ile kullanır, her container kendi cache'ini sahiplenir. Statik metotlar constructor servisi alamaz; bunlar süreç genelindeki varsayılan servisi kullanır ve CAC011 uyarısı alır.
Gerçek dünyada kullanımı
- Servis metotlarını denetleyen bir audit aspect'i, her container'a ait IAuditLog'a yazar; testler logları paylaşmaz.
- Repository benzeri sınıflarda cache backend'i composition root'ta yapılandırılan bir caching aspect'i.
- Bazı sınıfları container'dan alıp diğerlerinde hâlâ new kullanan, on yıllık bir kodun kademeli taşınması.
Neden önemli
Aspect'ler artık bağımlılıklarını global locator arkasına gizlemiyor; testler izole edilebiliyor ve başlangıç sırası kritik olmaktan çıkıyor. Eski kod, tüm aspect'leri yeniden yazmadan sınıf sınıf DI'a taşınabilir.