.NET Core - Aspect Oriented Programming ve Interception

Öncelikle, makaleme hoş geldiniz. Elimden geldiğince forumdakilerin '.NET Core' hakkında bilgilenmeleri ve modern programlamaya uymalarına yardımcı olmak istiyorum.

Öncelikle AOP nedir?
AOP; Aspect Oriented Programming yani yazılımın karmaşıklığını azaltmak, yinelenen kodlardan kurtulmak amaçlı bir bakış açısıdır. Uygulamada pek işlevi olmayan (authorizasyon, yetki kontrolu, loglama) gibi şeylerin parçalara ayrılarak uygulamanın çeşitli yerlerinde kodların tekrar edilmeden kullanılmasını sağlar.

AOP ve Interception yapısını daha iyi anlamak için bu yazımızda Cros Cutting Concerns'e de biraz değinmek istiyorum.

Cross Cutting Concerns nedir?
CCS'in çevrilmiş hali "çarpaz kesen ilgiler" demektir. Peki bu ifade ne anlama gelmektedir? Çok katmanlı mimari ile çalıştığımızda herhangi bir katmana bağlı kalmadan her katmanda kullanabildiğimiz işlere CCS deriz. Örneğin; caching, hashing, logging, exception handling,...

Yani biz CCS'i katmanlarda kolaylaştırmak için AOP'ye ihtiyaç duyarız. Eğer CCS var olmasaydı AOP'ye ihtiyaç duymayacaktık diyebiliriz.

Sphagetti Kod Örneği:
Kod:
public class PostManager:IPostService {
    IPostRepository PostRepository;
    ILoggerService LoggerService;
    public PostService(IPostRepository postRepository,ILoggerService loggerService){
        PostRepository = postRepository;
        LoggerService = loggerService;
    }
   
    public void Add(Post post){
        try{
            if(<<validasyon işlemi>>){
               
            }
            if(<<yetki kontrol işlemi>>){
           
            }
            PostRepository.Add(post);
        }
        catch(Exception e){
            loggerService.log($"Sistemde kritik bir hata meydana geldi: {ex.InnerException}");
        }
    }
}
Yukarıdaki kodda gördüğünüz gibi
  • Loglama
  • Yetki Kontrol Etme
  • Hata İşleme
hepsini kod içinde yaptık ve ortalık karıştı. Şimdi ise AOP'nin etkisini görelim.
Kod:
public class PostManager:IPostService {
    IPostRepository PostRepository;
    ILoggerService LoggerService;
    public PostService(IPostRepository postRepository,ILoggerService loggerService){
        PostRepository = postRepository;
        LoggerService = loggerService;
    }
   
    [LogAspect]
    [ValidationAspect(typeof(PostValidator))]
    public void Add(Post post){
       PostRepository.Add(post);
    }
}
Kesinlikle ilk koddan daha okunaklı olduğu bariz. İkinci kodda yaptığımız soyutlamalara baktığımızda C#'ta soyutlamalarımız birer Attribute'tur. Java, Php gibi dillerdede ise bunlara Annotation denir. Peki bu Attribute'lar nasıl çalışır? Bu Attribute'ları çalıştıran ara yazılıma interceptor denir. Eğer interceptor örneği yapmamı isterseniz lütfen cevap olarak belirtin. Umarım işine yarayan birileri çıkar :)
 

Technopat Haberler

Geri
Yukarı