26 Eylül 2007

Web Sayfalarını Temel Bir Class'tan Kalıtmak

Nesne yönelimli programlamanın (OOP) en temel yapı taşlarından biride kalıtımdır(inheritance). .NET mimarisinde her yerde olduğu gibi ASP.NET web uygulamalarında da gerek sayfa tiplerinde gerekse kontrollerde kalıtımın getirilerini ve etkilerini önemli derecede görüyoruz. Fakat eğitimlerimde ve kendi çevremde gördüğüm kadarıyla kalıtımın web sayfalarında en güzel uygulanabileceği noktalardan birisini kaçırıyoruz.

Şöyle bir senaryo üzerinden anlatmaya çalışacak olursam; bir projede kullandığımız birçok sayfanın ortak işlevleri olsun. Mesela bu sayfaların tamamında online kullanıcı sayısını görüntülemek isteyebiliriz. Yine sayfanın title bilgisini veritabanından dinamik olarak çekip görüntülemek isteyebiliriz. Normal şartlarda aklımıza gelen ilk yol tüm sayfaların code-behind kısmında bu işlemleri metot-property olarak tek tek yazmak olabilir. Yine bu işleri yapan bir class yazarak her sayfada class'ın nesne örneğini elde ederek bu işlemi instance üzerinden yürütmekte akla gelen bir diğer yol olabilir. Fakat benim bahsetmek istediğim yol bu iki yoldan da daha kolay ve pratik olacaktır.

Bildiğimiz gibi aspx uzantılı sayfalarımız System.Web.UI.Page sınıfından kalıtılarak elde edilir. Eğer kendimiz için bir sayfa prototipi çıkarır ve bunu System.Web.UI.Page sınıfından kalıtılan BasePage isminde bir class olarak oluşturursak, artık Default.aspx gibi bir sayfanın class'ını System.Web.UI.Page yerine BasePage gibi bir class'tan kalıtacak olursak istediğimiz işlemi gerçekleştirmiş olacağız. Anlaşılmadı mı? O zaman örnek kodlara bakalım.

BasePage.cs
public class BasePage: System.Web.UI.Page
{
public int OnlineKullaniciSayisi
{
get {
// Online kullanıcı sayısını bul ve return ile döndür
}
}
public BasePage()
{
// Tüm sayfalar ilk çalıştırıldığında yapılması istenilen değişiklikler
// constructor'da yapılabilir. Örneğin; sayfanın adını çözümle,
// veritabanına git ve sayfanın ziyaret edilme sayısını 1 arttır...
this.Title = "Dinamik oluşan başlık bilgisi...";
}
}

Default.aspx
public partial class Default : BasePage
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("Sitedeki online kullanıcı: " +
this.OnlineKullaniciSayisi.ToString());
}
}

Böylece artık tüm sayfaları BasePage isimli class'tan kalıtarak sayfalar ile ilgili temel ve ortak işlemleri daha kolay yönetebilir hale getirebilirsiniz.

Hiç yorum yok: