MVC Framework Önerileri 1 - AbstractController
MVC Framework iyiden iyiye büyük projelerde kullanılmaya başlandı. Hoş ben çıktığından beri istisnasız kullanıyorum =) Web Form ne demekti unuttum sayılır :P Ancak MVC bize hazır bir pattern getirse bile yine de bazı eksiklikleri ve bizim dikkat etmemiz gereken noktaları var. Bahsedeceğim nokta Controller yapımızla ilgili.
Sorunu anlamak için başımdan geçen örnek bir senaryo vereyim:
Geliştirdiğimiz bir sitenin aynı fiziksel site üzerinden birden çok müşteriye hizmet vermesi isteniyor. Müşterilerin bir listesi konfigürasyon xml’i olarak saklanacak ve gerekli bilgiler buradan alınacak. Ancak gelen isteğin hangi müşteriye ait olduğunu subdomain kullanarak anlamamız gerekiyor.
Bu problemin çözümü tek controller kullandığımız zaman oldukça kolay. Ancak birden çok controller bulunması halinde, tüm controllerlar ve bu controllerlar içerisindeki tüm actionlar için aynı işlemin yapılması gerekecek. DRY (Don’t Repeat Yourself) Principle bize ne demekte: Eğer uygulamanızda tekrarlayan kodlar varsa tasarımı gözden geçiriniz. Şimdi bu sorun (ve tabi ki benzer mantığa sahip diğer tüm sorunlar) için kullanılan çözümü inceleyelim: Abstract Controller.
Yukarıdaki class diagramın göstermekte olduğu gibi elimde iki adet controller var, Home ve Help. Bu controllerlar ortak olarak AbstractController sınıfından türemekteler. Peki controller olma özelliklerini kaybettiler mi? Hayır çünkü temel AbstractController sınıfı Controller’dan türemekte.
AbstractController.cs
public abstract class AbstractController : Controller
{
public string CustomerName { get; set; }
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
//url'den ayırma işlemi yapıldığını varsayıyoruz
CustomerName = "Yüce Çelikel";
ViewData["CustomerName"] = CustomerName;
}
}
Görüldüğü gibi AbstractController içerisinde CustomerName isminde bir özellik tanımladık. Bunun yanında OnActionExecuting metodunda ViewData içerisine bu CustomerName’i yerleştirdik. OnActionExecuting metodu bir action çalıştırılmadan önce yapılacak işlemleri belirlememizi sağlar. Bu metot AbstractController içerisinde tanımlandığı için artık bu sınıftan türeyen tüm Controllerlar çalıştırılmadan önce ViewData içerisine müşteri bilgisi eklenecek. Eğer bilgi çıkarma algoritmasında bir değişiklik olursa tek tek tüm controllerları ellemek zorunda kalmayacağız ;)
Ben AbstractController üzerine bir de AbstractDbController koyarak database erişimi olacak olan controllerı da ayırmayı tercih ediyorum. Her controller illa ki bir data kaynağı nesnesi oluşturmak zorunda değil ne de olsa ;)
Şimdilik bu kadar arkadaşlar. Zaman buldukça aklıma gelen önerileri ve bilgileri yine paylaşacağım buradan. Esen kalın..
