MVC Deep Dive -1 (Performans Notları-1)

7 Ocak 2015
Posted by Çağatay Yıldız
2320 Views
MVC

Bilindiği üzere Asp.Net MVC yapısal olarak bir çok performans avantajı ve esneklik sunmuştur. View kısmında tamamen html odaklı yazmamız derlenme esnasında bize ciddi bir performans sunmakta. Web Forms teknolojisinden Asp.Net ailesinin kendine ait tool ları html e derlenmekte ve bir çok kontrol ayağa kalkmaktaydı. Performans notlarında MVC de maksimum performans için gerek view kısmında gerekse controller daki iş parçacıklarında bazı yapılandırmalar yapacağız.

İlk işimiz view engine kısmındaki ViewResult larımızın arama esnasında spesikik olarak sadece .cshtml uzantılı dosyaları araması. Örneğin home adında controller ve about adında bir actionresult oluşturup projeyi çalıştırdığımızda aşağıdaki ekranla karşılaşacağız.
view-engine

Gördüğünüz gibi aradığı lokasyonda bir çok ViewEngine e bakmaktadır. Uzantılardan da anlaşılacağı gibi .aspx ve .ascx ViewEngine lere de aramakta. Tamamen razor kodlama yaptığımızda bu dosyalara gerek olmayak. Dolayısıyla bir yapılandırmayla sistemin bu dosyaları aramasını engelleyip performansı yükselteceğiz. Global.asax içerisinde bulunan Application_Start metoduna yazacağımız kod şu şekilde.

            ViewEngines.Engines.Clear();
            ViewEngines.Engines.Add(new RazorViewEngine());

Görüldüğü üzere ViewEngine kısmı temizlenmekte ve sadece RazorViewEngine lerde arama yapmakta. Bu kod satırından sonra karşılaşacağımız ekran görüntüsü ise şu şekilde
view-engine-2

Görüldüğü üzere sadece Razor kısımlarında bir arama yapmaktadır.

Razor View Engine Kısmını Custom Hale Getirmek
MVC de bu aramayı custom hale getirebiliriz. Yani sadece cs.htmllerde arama yapmasını sağlamamız mümkün. Bunun için CustomRazorViewEngine adında bir class oluşturuyorum. Class ım RazorViewEngine class ından miras almakta.

    public class CustomRazorViewEngine:RazorViewEngine
    {
        public CustomRazorViewEngine()
        {
            AreaViewLocationFormats = new[]
             {
             "~/Areas/{2}/Views/{1}/{0}.cshtml",
             "~/Areas/{2}/Views/Shared/{0}.cshtml"
             };
                        AreaMasterLocationFormats = new[]
             {
             "~/Areas/{2}/Views/{1}/{0}.cshtml",
             "~/Areas/{2}/Views/Shared/{0}.cshtml"
             };
                        AreaPartialViewLocationFormats = new[]
             {
             "~/Areas/{2}/Views/{1}/{0}.cshtml",
             "~/Areas/{2}/Views/Shared/{0}.cshtml"
             };
                        ViewLocationFormats = new[]
             {
             "~/Views/{1}/{0}.cshtml",
             "~/Views/Shared/{0}.cshtml"
             };
                        MasterLocationFormats = new[]
             {
             "~/Views/{1}/{0}.cshtml",
             "~/Views/Shared/{0}.cshtml"
             };
                        PartialViewLocationFormats = new[]
             {
             "~/Views/{1}/{0}.cshtml",
             "~/Views/Shared/{0}.cshtml"
             };
        }
    }

Görüldüğü gibi 6 adet farklı lokasyonlara ait formatlar oluşturup bu formatlara belli atamalar yaptım. Adlarındanda anlaşıldığı gibi 3 tanesi area tanımlamalarında kalan 3 ü ise ana dizin tanımlamalarında geçerli. Mevcut bu string dizi tanımalamarı VirtualPathProviderViewEngine adlı class da bulunmaktadır. Bu class ise IViewEngine interface inden türemekte. Buradaki lokasyon tanımlamalarıyla ilgili ayrıntılı bilgiyi Professional ASP.NET MVC kitabının(Jon Galloway, Scott Hanselman, Phil Haack, Scott Guthrie, Rob Conery) 442,443,444 nolu sayfalarından bulabilirsiniz. Link ()
Mevcut yapılandırmadan sonra global.asax daki yapımızı tekrar değiştirip projeyi çalıştırıyoruz. Karşımıza çıkan ekran görüntüsü şu şekilde
view-engine-3

Gördüğümüz gibi artık sadece cs.html uzantılı dosyaları arayacaktır. Bu şekilde ViewEngine kısmındaki performansımızı arttırmış olduk.