ASP.Net MVC 3 Notları – 2(GlobalActionFilter)

Geliştirdiğimiz Web uygulamalarında, rutin olarak her istemede bazı işlemler yapmamız gerekebilir. Söz konusu istem sürecini bir sayfa oluşum süreci olarak da düşünebiliriz. Bu süreci ASP.Net MVC 3 ile gelen GlobalActionFilter özelliği ile çözebiliriz. Konuyu daha iyi anlama adına örnek uygulama hazırlayalım.

Uygulama için ASP.Net MVC 3 (ASP.Net MVC 3 sürümü ve diğer bilgiler için bağlantıdaki bilgilere bakınız.) oluşturalım. Oluşturmuş olduğunuz ASP.Net MVC 3 projesine, Utils klasörü oluşturalım ve bu klasöre StopWathAttribute isimli bir sınıf ekleyelim.

image

Eklemiş olduğumuz sınıfın içerisine girelim. Söz konusu sınıfın ActionFilterAttribute sınıfında türetelim. ActionFilterAttribute sınıfı üzerinde türetmiş olduğumuz, StopWathAttribute sınıfını ActionFilterAttribute nesnesi üzerinden gelen OnActionExecuting ve OnResultExecuted olaylarını override edelim.

namespace Mvc3GlobalActionFilters.Utils
{
    using System.Diagnostics;
    using System.Web.Mvc;
 
    public class StopWatchAttribute : ActionFilterAttribute
    {
        private Stopwatch wath;
 
        public StopWatchAttribute()
        {
            this.wath = new Stopwatch();
        }
 
        public override void OnActionExecuting(
                ActionExecutingContext filterContext)
        {
            this.wath.Start();
 
            base.OnActionExecuting(filterContext);
        }
 
        public override void OnResultExecuted(
                    ResultExecutedContext filterContext)
        {
            this.wath.Stop();
 
            var context = filterContext.HttpContext;
            var response = context.Response;
 
            context.Response.Write(
                string.Format("<!-- oluşturma süresi {0} -->", 
                                this.wath.Elapsed.ToString()));
 
            base.OnResultExecuted(filterContext);
        }
    }
}

Sınıf içerisinde override etmiş olduğumuz olaylar ile uygulama üzerine yapılan istemleri takip edeceğiz. Bu uygulamamızda, geliştirdiğimiz uygulamaya yapılan istemlerin süreçleri hesaplayacağız. Bu işlemler için System.Diagnostics altında yer alan StopWatch nesnesini kullanacağız. Bu nesne yardımı ile istemin başlangıcı dan bitişine olan süreci, zaman birim olarak elde etmiş olacağız.

Yapmaya başladığımız bu uygulamada OnActionExecting olayında süreç hesaplama işlemine başlıyoruz. Bu işlem sayfa hazırlanması ve kullanıcıya sunulması tamamlanması olayı olan OnResultExecuted da duruyoruz. İşleminin sonucunu görmek adına OnResultExecuted olayı parametresi olan filtercontext nesnesini Response ile sayfasına oluşum süresini yazdırıyoruz.

namespace Mvc3GlobalActionFilters
{
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Routing;
    using Mvc3GlobalActionFilters.Utils;
 
    public class MvcApplication : HttpApplication
    {
        public static void RegisterGlobalFilters(
                        GlobalFilterCollection filters)
        {
            /// Uygulama içerisinde hata yönetimini 
            /// yapana globalfilter nesnesini 
            /// ASP.Net MVC sistemine kayıt edildi.
            filters.Add(new HandleErrorAttribute());
        }
 
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 
            routes.MapRoute(
                "Default",
                "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", 
                    id = UrlParameter.Optional });
        }
 
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
 
            /// Hazırlamış olduğumuzu global action filter nesnesini
            /// ASP.Net MVC sistemine tanıtmış olduk.
            GlobalFilters.Filters.Add(new StopWatchAttribute());
 
            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

Geliştirmiş olduğumuz StopWathAttribute nesnesini uygulama içerisinde kullanmak için Web uygulamasının kalbi olan Global dosya içersinde bulunan Application_Start() olayında GlobalFilter koleksiyonuna dahil etmemiz gerekmektedir (Bu işlem ActionFilterAttribute üzerinden türetimesi nedeniyle polimorfik olarak gerçekleşecektir.).

Hazırlamış olduğumuz örneğinin sürecini inceleyecek olursak;

  1. Web uygulamasından istem yapılır.
  2. Yapılan bu istem sonucunda Application_Start() olayı ile GlobalFilter koleksiyonuna, hazırlamış olduğumuz ActionFilterAttribute nesnesi eklenir.
  3. Koleksiyona eklene ActionFilterAttribute nesnesi, sıra ile olaylarını tetikler.
  4. Son olarak Sayfa sonuna, sitem süreci yazılarak işlem tamamlanır.

Not: “RegisterGlobalFilters “ isimli fonksiyonu içerisinde yer alan “HandleErrorAttribute” nesnesi ile ASP.Net MVC 3 sürümü öncesi Controller de hata yönetimi için kullandığımız HandleError attribute yerine daha kolay hata yönetimi yapmamıza olanak tanımaktadır.

image

Bu makalemizde ASP.Net MVC 3 yeniklerinde biri olan GlobalActionFilters özelliğini inceleye çalıştık. Bu ile de ASP.Net MVC Notları serisinin ikinci bölümünü tamamladık. Uygulama örneklerini son makalemizin sonunda bulunan repository ile sizlere sunacağım. Konu ile ilgili sorularınızı info@ibrahimatay.org eposta adresine gönderebilirsiniz.

IBRAHIM ATAY

Teşekkürler

Leave a Reply

Your email address will not be published. Required fields are marked *