Hasan Akpürüm
Kıdemli Yazılım Danışmanı
Makele Detayı

PostSharp Muadili MrAdvice Aspect Oriented Programming

12.12.2018 16:02:20

 

AOP(Aspect Oriented Programming) için genel anlamda birbirleri ile kesişen iş parçacıkları arasındaki karmaşaya çözüm getiren yapıdır diyebiliriz. Bu noktada OOP’da (Object Oriented Programming) çözüm olarak kullanılabilir. Fakat AOP konusunu, daha çok çalışma zamanı noktasında karşılaşabileceğimiz durumlar için düşünmemiz gereklidir. Örnek olarak bu durum için çalışma zamanında bir nesnenin property değişikliği yapma,loglama,cacheleme gibi düşünebiliriz.

MrAdvice

AOP için halihazırda ücretli bir ürün bulunmakta ve adı postsharp‘dır. PostSharp size kendi attribute’nizi yazabilmeniz için bir Base Attribute sunar ve bunu kullanarak ihtiyaç dahilinde kesişen iş parçacıklarımıza daha etkin çözüm bulabiliriz. AOP yaklaşımına uygun ve ücretsiz bir ürün olan MrAdvice, PostSharp’ın alternatifi olarak kullanılabilir. MrAdvice açık kaynaktır ve kullanımına ilişkin basit bir console uygulamasını aşağıdaki gibi inceleyebiliriz.

Package Console üzerinden nuget komutu ile kütüphanemizi dahil ediyoruz

Install-Package MrAdvice

Ben logging işlemi için AOP uygulacağımdan LogingAspect adında bir sınıf oluşturuyorum.

LogingAspect.cs

LogingAspect.cs sınıfımızı Attribute sınıfından IMethodAdvice interface inden miras alıyoruz ve geçerli kütüphaneyi sınıfımıza dahil ediyoruz.

Sonrasında cross cutting işleminde araya girecek Advise methodumuzu tanımlıyoruz.

Kısaca çalışma sistemini açıklayacak olursak LogingAspect attribute ünü tanımladığımız class ya da method çağırıldığında ilk olarak Advise methodumuza gelir. Burada context objemiz üzerinden class ya da methodumuza gönderilen parametreler,class adı,method adı,namespace adı vb. gibi birşey özelliği bize verir. Method başladığında gerçekleştirmek istediğimiz işlemler yağılır. Sonrasında context.Proceed(); methodu çağırılarak kaldığı yerden devam ettirilir. Method da işlemler gerçekliştikten sonra context.HasReturnValue herhangi bir değer dönüyorsa true gelir. context.ReturnValue property si ilede methodun return ettiği objeye erişilir. İsterseniz bu obje üzerinde kestra bir değişiklik yaparak methodun döndüğü değeri override edebilirsiniz. Not : Eğer iş yaptığınız method işerisinde try cath bloğunuz yoksa buradaki işlemleri try cath bloğuna alarak hatayı buradanda yakalayabilirsiniz.

 

 

UserService isimli class açarak içerisine GetUserName methodu ekledik.İşlemin sadece bu method'da yapılmasını istediğimiz için [LogingAspect] attribute'ümüzü tanımladık.

Sonuç:

 

 

Method çağırışdığı anda LoggingAspect attribute sınıfımız devreye girdi. Method adını ve göderilen değerleri ekrana yazdırdı. Sonrasında işlem kaldığı yerden devam ettirildi tekrar LogAspect sınıfımız işlemin bitimi loglamasını yaptı ve bitirdi. Eğer LoggingAspect attribute sınıfımızı UserService classımıza direk olarak tanımlasaydık bu işlemler o sınıftaki hermethod için geçerli olacak.ı ctor' dahil. Aşağıdaki gibi :

 

Son olarak methodumuzda hata oluşma senaryomuzu deneyelim neler olacak. Boş bir throw new ArgumentNullException(); fırlatıyorum

Hatayı Debug.WriteLine methodu ile Output a yazdırdık. İşlemimiz normal akışına devam etti ve arkaplanda hatayı logladı.

Umarım faydalı bir makale olmuştur.

Saygılarımla

Github

 

Yorumlar
  • picrap@gmail.com29.5.2019 15:21:52

    (I don't read turkish, so Google translate helped me). I'm the author of Mr Advice, thanks for your article ;)

Yorum yaz

Thanks, your message is sent successfully.