İçeriğe geç

MVC’de Action Filters: Loglama ve Yetki Kontrolü

Action filter yapısına giriş

ASP.NET Core mimarisinde uygulama geliştirirken, kodun modülerliğini korumak ve her Controller metoduna aynı tekrarlayan işlemleri eklemekten kaçınmak yazılım kalitesi açısından kritiktir. Action Filter yapısı, tam bu noktada devreye girerek geliştiricilere istek hattına müdahale etme şansı sunan esnek bir mekanizma sağlar. Bu filtreler, bir Controller eylemi tetiklenmeden önce hazırlık yapılmasına veya eylem tamamlandıktan sonra sonuçların işlenmesine olanak tanır. Genellikle loglama, önbelleğe alma ve veri doğrulama gibi genel sorumlulukları merkezi hale getirmek için kullanılırlar. Bu yaklaşım, iş mantığının temiz kalmasını sağlarken, uygulamanın farklı katmanları arasındaki bağımlılığı azaltır. Bu makalede, Action Filter kavramını derinlemesine ele alarak, her gelen isteği otomatik olarak veritabanına kaydeden özel bir yapılandırmanın nasıl inşa edileceğini tüm detaylarıyla öğreneceğiz.

Action filter çalışma mekanizması

Action filtreleri, ASP.NET Core filtre hattının (filter pipeline) önemli bir parçasıdır. Bir HTTP isteği ilgili Controller metoduna ulaşmadan hemen önce OnActionExecuting metodu çalıştırılır. Bu aşamada, metoda gelen parametreleri kontrol edebilir, gelen veriyi değiştirebilir ve hatta belirli şartlar sağlanmıyorsa isteği metodun içine hiç sokmadan sonlandırabilirsiniz. Metot başarılı bir şekilde icra edildikten sonra ise OnActionExecuted metodu devreye girer. Bu aşamada ise üretilen sonucu analiz edebilir, işlem süresini ölçebilir veya çıktı üzerinde son düzenlemeleri yapabilirsiniz. Bu iki yönlü çalışma prensibi, bir işlemin öncesini ve sonrasını tek bir sınıfta sarmalamayı mümkün kılar. Filtreler, uygulandıkları kapsama göre sadece tek bir metodun, tüm bir sınıfın veya tüm uygulamanın davranışını değiştirebilirler.

Özel bir log filtresi oluşturma

Kendi loglama filtrenizi oluşturmak için genellikle ActionFilterAttribute sınıfından türetilen veya IActionFilter arayüzünü uygulayan bir sınıf tanımlarsınız. Loglama işlemi için filtrenin temel görevi, o anki HTTP bağlamından (HttpContext) gerekli verileri çekmektir. Bu veriler arasında isteğin yapıldığı Controller adı, Action adı, kullanıcı bilgileri, IP adresi ve isteğin gönderildiği tarih gibi kritik bilgiler yer alır. OnActionExecuting içerisinde işlemin başlangıç zamanını kaydedip, OnActionExecuted içerisinde bitiş zamanını hesaplayarak her bir isteğin veritabanında ne kadar sürede tamamlandığını da izleyebilirsiniz. Bu yapı, uygulamanın performans darboğazlarını tespit etmek için paha biçilemez bir veri kaynağı oluşturur. Oluşturulan sınıf içerisinde HttpContext üzerinden erişilen her bilgi, veritabanındaki log tablosunun birer sütununa karşılık gelir.

Bağımlılık yönetimi ve veritabanı entegrasyonu

Filtreler içerisinde veritabanına kayıt yapabilmek için genellikle bir veritabanı bağlamına (DbContext) ihtiyaç duyulur. Ancak standart nitelikler (attributes) çalışma zamanında doğrudan bağımlılık enjeksiyonunu (Dependency Injection) desteklemezler. Bu sorunu aşmak için ServiceFilter veya TypeFilter yapıları kullanılır. Bu sayede, filtreniz içerisine veritabanı sınıfınızı constructor üzerinden enjekte edebilirsiniz. Loglama işlemi sırasında, OnActionExecuted metodu içinde veritabanı nesnesi çağrılarak yakalanan bilgiler bir model aracılığıyla ilgili tabloya yazılır. Bu süreçte dikkat edilmesi gereken en önemli nokta, loglama işleminin ana uygulamanın akışını bozmamasıdır. Hatalı bir loglama kodunun tüm uygulamayı durdurmaması için bu bölümler hata yakalama bloklarıyla çevrelenmeli ve asenkron yöntemlerle veritabanına yansıtılmalıdır.

Filtrelerin uygulama içerisindeki konumu

Tasarlanan [Log] filtresi üç farklı seviyede uygulanabilir. İlk olarak, sadece belirli bir Controller metodunun üzerine eklenerek o metodun izlenmesi sağlanabilir. İkinci olarak, bir Controller sınıfının en tepesine eklenerek o sınıftaki tüm metodların loglanması gerçekleştirilebilir. Son olarak, Program.cs veya Startup.cs dosyası içerisinde global filtre olarak kaydedilerek, uygulama genelindeki tüm HTTP isteklerinin istisnasız veritabanına kaydedilmesi sağlanabilir. Genellikle kritik işlemlerin yapıldığı metodlar için özel uygulama tercih edilirken, izlenebilirlik için global uygulama daha yaygındır. Bu hiyerarşik yapı, geliştiriciye hangi verinin ne detayda toplanacağı konusunda tam bir kontrol imkanı tanır. Filtrelerin çalışma sırası da bu hiyerarşiye göre belirlenir ve önce global, sonra sınıf, en son ise metot seviyesindeki filtreler tetiklenir.

Action filter kullanımının sonuçları

Bu makalede, ASP.NET Core ekosisteminde kod tekrarını azaltan ve merkezi bir kontrol mekanizması sunan Action Filter yapısını detaylı bir şekilde inceledik. Bir isteğin yaşam döngüsü boyunca Controller metodundan önce ve sonra nasıl devreye girileceğini, çalışma mantığını ve özel bir loglama filtresinin nasıl oluşturulacağını adım adım ele aldık. Özellikle bağımlılık enjeksiyonu ile veritabanı entegrasyonunun nasıl sağlanacağını görerek, uygulamanın her noktasında çalışabilecek esnek bir yapı kurduk. Sonuç olarak, Action Filter kullanımı sadece kodun okunabilirliğini artırmakla kalmaz, aynı zamanda bakım süreçlerini de büyük ölçüde kolaylaştırır. Doğru uygulanan bir filtreleme stratejisi, uygulamanızın performans takibini, güvenliğini ve hata analiz süreçlerini daha profesyonel bir seviyeye taşıyarak yazılım mimarinizi daha sağlam ve ölçeklenebilir hale getirecektir.

Resim Sahibi: Brett Sayles
https://www.pexels.com/@brett-sayles

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir