16 Temmuz 2011 Cumartesi

Substition Cache Kavramı

Substition Cache kısaca, sayfanın tümünün cachelenip, sadece bazı bölümünün dinamik olarak değiştiği sayfalarda kullanılır. Örneğin, sayfanız 2-3 ayda bir yenileniyordur fakat, sayfanın en altında merkez bankasından o anki kuru alıyorsunuzdur. Çok ufak bir bölüm için, sürekli tüm sayfayı yeniden oluşturup, html render etmeye gerek yok. Bunun yerine tüm sayfayı cacheleyip, sadece o kısmı hariç tutarsak, daha doğru bir kodlama yapmış oluruz. İşte bu tür cacheleme biçimine de Substititon Caching denir.

Substition caching yapmak için, önce tüm sayfayı output cache'e koymamız gerekir. Bunun için sayfamıza,
 

<%@ OutputCache VaryByParam="none" Duration="300" %>


ekleriz. Böylece, şu anda tüm sayfamızı cachelemiş olduk. Şimdi sayfamızda dinamik gelmesini istediğimiz kısmı oluşturmamız gerekecek. Bunun için ToolBox'da bu işlem için Substition kontrolünün olduğunu görüyoruz. Bu kontrolün görevi, bulunduğu kısıma (bu kısım div, td ..vs gibi bir yer olabilir) dinamiklik getirmek. 

2x2'lik bir table oluşturup, kolonlardan birine label ve Substition kontrolünü atıp, sayfanın PageLoad'ına o label'ın text'ine o anki saati yazdıralım. Tabiki tüm sayfa cacheli olduğundan bir de sayfada herhangi bir yere label koyup, o label'a da o anki saati yazdıralım. Bu işlemleri yapıp çalıştırdığımızda göreceğiz ki, sayfada bulunan label, bir kere o anki saati gösterip, 300 sn boyunca sürekli aynı saati cacheden getirecek. Fakat td'nin içinde bulunan saat, sürekli olarak dinamik olarak saati getirecek.

Sayfanın bu şekilde oluşmasını bekleriz. Akıllara şöyle bir soru gelebilir. Sayfa cache'den geldiğinden, page lifecycle süreci çalışmayacak, dolayısıyla html render edilip bize geri dönmeyecek. Çünkü ilk get talebimizde bu işlemler yapılıp cache'e atılmıştı. Peki, substition kontrolü ile gerçekleştirdiğimiz dinamik yapı da, lifecycle sürecine katılmayıp html olarak bize geri gelmeyecek mi? 

İşte bu sıkıntıdan kurtulmak için, Substition kontrolü bizden bir metot yazmamızı istiyor. Bu metot, cache'den gelen, daha önce render edilmiş html'in içine gömüleceğinden, geriye string döndürmeli. Dolayısıyla biz geriye, html formatında bir yapı döndürmeliyiz. Çünkü lifecycle sürecini hatırlarsak, sayfaya talep yaptığımız zaman, compiler  html oluşturup bize geri gönderiyor ve sayfamız ortaya çıkıyor. Burada da, dinamikliği oluşturduğumuz kısım da html'in içinde yer alması gerektiğinden, bizim bu metotda html formatında bir string geri döndürmemiz gerekir. Ayrıca, şunu da unutmamalıyız ki, sayfa cache'den geleceğinden, sayfa oluşmadan bu metot çalışacak. Dolayısıyla metodumuzu static yapmalıyız. Bu durumda metotumuzu yazarsak, basit olarak;


    protected static string DinamikIcerik()
    {
        return string.Format("<İnput type='text' value='{0}' />", DateTime.Now.ToLongTimeString());
    }

Bu metot ismini de Substition kontrolünün property'lerinde bulunan MethodName özelliğine verirsek, artık sayfamız istediğimiz biçimde, sadece belli bölgesi dinamik olacak şekilde cachelenmiş olarak çalışacak. Ekran çıktılarına bakacak olursak;







NOT: Üstteki Labellarda gösterilen saatler, sayfa içerisinde cache'den getirilen saatlerken, altta bulunan saat ise td'nin içinde bulunan substition kontrolü sayesinde dinamik olarak gelen saattir.
NOT2: Yukarıda, yazdığım metotda bulunan span html kontrolünde, blogger editörü html kodlarını derlediğinden bilerek ve isteyerek büyük i -İ- harfini koydum, blogun derleyememesi için. Heyecan yapmayınız.

0 yorum: