Makale Özeti

Bu makalemizde MVC Framework 'e giriş yapıyoruz.

Makale

Bu makalemizde web uygulamalarının nesne tabanlı programlaması olarak adlandırılan model görünüm kontrol (MVC) yapısını incelemeye çalışacağız.

MVC (Model View Controller) yıllardır web uygulamalarında kullanılmaktaydı. Kullanım amacı ise internet sayfalarındaki hızı sağlamaktır. Basit bir biçimde yapmış olduğumuz web uygulamalarını hatırlarsanız internette görünecek olan sayfanın kodlarına yönlendirme kodlarından, veri tabanı kontrol kodlarına, Scriptlerden standart html kodlarına kadar birçok kodu gömerdik. Bu tür hazırlamış olduğumuz sayfaları derlemek istediğimizde ise internet sağlayıcısı arka plan kodların hepsini çalıştırmaya çalışacak. Eğer ki bu sayfanıza ondan fazla kişi girmeyecekse MVC ile anlatacaklarımız bir işinize yaramayacaktır. Fakat profesyonel amaçla hazırlanan web sayfalarına on kişiden fazla kullanıcı gireceğinin bu kullanıcılardan en az ikisinin tarayıcı hatası veya benzer hatalardan ötürü sayfadan çıkmak zorunda kalacağı bizim karşımıza kaçınılmaz gerçekler olarak çıkıyor. Bu gerçekler karşısında ise ne tür durumlar ile karşılaşacağımızı düşünmeye çalışalım. Düşünmüş olduklarımızı da maddeler olarak sıralayalım.

İlk olarak aklımıza gelen sorun web sayfalarının internet tarayıcılarında geç açılmasıdır.

   o Bu sorunun gerçekleşmesinin sebeplerini basitçe araştıralım. İlk aklımıza gelen son kullanıcının kullanmış olduğu mevcut internetin hızının yavaş olmasıdır. Fakat bizim yapacak olduğumuz web sayfaları bu tür sorunları rahatlıkla yenebilecek kuvvetlerde olmalıdır. Bu sorunu ortadan kaldırmak içinde görünen sayfalara minimum düzeyde veri tabanı kodu ve yönlendirme kod parçacıkları koymamaktır.
   o Bir diğer sorun ise kullanıcının bilgisayarının güçsüz olmasıdır. Bu tür sorunları da bizim hazırlayacak olduğumuz web sayfalarının minimum boyutta maksimum işlemi yaptırarak ortadan kaldırabiliriz. Yine minimum boyutu sağlayabilmemiz için yukarıdaki koşulları gerçekleştirmemiz gerekmektedir.

Web sayfalarının geç açılmasının bir diğer sebebi de aşırı yoğunluktan ötürüdür. Bu aşırı yoğunluk karşısında yapılabilecek çözümlerden biri web sayfasının bulunduğu hosting şirketi ile temasa geçmektir. Bu hosting şirketi bize sitemizin maksimum 1000 kişiye kadar aktif kullanıcı alabileceğini söyleyebilir. Bu durumda bizim yapmamız gereken sitede aktif kaç kişinin olduğuna bakmak olacaktır. Bakmış olduğumuz kişilerin sayısı 600 – 700 civarında olduğunu fark edeceksiniz. O zaman aklımıza şöyle bir soru takılıyor. Neden hosting şirketi bize 1000 kişiye kadar aktif kullanıcı kabul edebilirsiniz dediği halde bizim sistemimiz 700 kişide çöküyor. Bunun da çok basit bir açıklaması var. Görünen sayfada veri tabanı bağlantıları kullanmaktır. Bu bağlantı kodları web sayfasını kullanan kullanıcıların aldıkları hatalar sonucunda sistemin dışında kalmalarından ötürü aşırı yoğunluk oluşmuştur.

Aklımıza gelen başlıca iki sorunu sıraladık. Bir de nesne tabanlı programlama mantığı ile geliştirmiş olduğumuz uygulamaları aklımıza getirmeye çalışalım. Bu tür uygulamaları geliştirirken ilk olarak yaptığımız veri tabanı bağlantı işlemleri için bir sınıf hazırlamak oluyordu. Daha sonrasında sorgu cümlelerinden veri tabanında yer alan tablolara nesne olarak erişmemiz için oluşturduğumuz sınıflara kadar ilerliyordu. En sonunda formumuzun arka planında oluşan kod yalnızca form üzerinde yer alan kontrollerden alınan verilerin başka sınıflara yönlendirilerek işlem yapması olmaktadır. Bu mantıkta bizim hazırladığımız uygulamaların kod bakımından elimizden geldiğince güvenlikli ve anlaşılır olması sağlanacaktır.

Şimdi bu tür mimari yapılarla oluşturmuş olduğumuz uygulamaların bize sağladığı kazançları düşünmeye çalışalım.

Kod güvenliği
Anlaşılabilirlik
Okunabilirlik
Yönetilebilirlik
Yenilenebilirlik

ve benim aklıma gelmeyen daha nice kazancı sıralayabiliriz. Bize sağlanan kazançları düşündükçe uygulamanın geleceğinin uzun olacağını ve bizlerden sonra uygulamayı geliştirecek olan yazılımcılara da çok büyük kolaylıklar getirecektir. Aynı şekilde bizim geçeceğimiz uygulamalar içinde aynı düşünceler geçerlidir.

Yukarıda anlatmış olduğumuz bilgiler ışında makalemizin asıl konusu olan MVC yapısına değinmeye başlayabiliriz. Ama ilk olarak MVC yapısını grafiksel olarak anlatan bir görüntüye göz atmakta yarar vardır.


Model, View ve Controller kavramlarına hangi amaçla kullanıldıklarını birer cümle ile açıklamaya çalışalım.

Model: Model genellikle veri tabanı işlemlerimizi yani işlerimizi( business ) yaptığımız yapıdır. Veri tabanımız üzerinde yapılabilecek sorgularımızı burada belirler ve Controller ’ı atamamızı sağlarız. Bu sayede veri tabanımıza dışarıdan daha kolay erişebilir ve çeşitli metotlarla daha kolay idare/müdahale edilebilir hale getirir.

View: Bu bölüm kullanıcıya cevap olarak döndürülen arayüzdeki statik ya da dinamik bileşenleri (html, jsp, css, aspx, ...) barındırır. Diğer yardımcı yapılar yardımıyla programcılara da oldukça anlaşılır ve tamamıyla sayfa üzerinde kullanıcıya gösterilen form araçlarının bulunduğu kod parçası kalır.

Controller: Model yardımıyla oluşturduğumuz sorguların kullanıcı tarafından alınan veriler ile birleşip uyumlu bir biçimde çalışmasını sağlayan yapıdır. En genel tanımı Uygulamaya gelen sorgulara karşı nasıl cevap verilmesi gerektiği konusunda planı yapan, hareketi planlayan bölümüdür.

Genel olarak MVC ‘yi ayrı ayrı tanımladık. Fakat değinmemiz ASP.net teki MVC Framework ‘e girmeden önce MVC mimarisi üzerinde değinilmesi gereken bir nokta daha var. Bu nokta ise hangi katmanın hangi katmana erişip erişemediğini bilmemizdir. Bunu neden bilmemiz gerektiğine gelirsek, programlamayı yaparken daha rahat hareket edebilmemiz içindir.

Yukarıda vermiş olduğumuz resimden yararlanarak anlatmaya başlayalım. İnternette yayınlanmakta olan sistemimize kullanıcıdan istek gelmesinden itibaren hareket edersek, ilk olarak kullanıcı sayfaya girerek bir kontrol üzerinden isteğini yapıyor. Bu istek doğrultusunda Controller bu isteği karşılıyor. Controller ‘e gelen istek kendi bünyesinde bulunan Business sayesinde işlemlerin gideceği yön belirlenir. Genellikle MVC yapılarını veri tabanı işlemleri için kullanırız. Bu sebepten ötürü genellikle Business yapılarımızın içerisinde SQL işlemleri bulunuyor. Bu işlemlerin yapılabilmesi için veri tabanı tablolarına ulaşılması gerekiyor. Fakat her seferinde bu isteği yapmak bizim sistemimizin yavaşlamasına sebep olacaktır. Bu sorunu gidermekte veri tabanına olduğunca az erişerek en çok işi yapmaktan geçmektedir. Bizim bu işlemlerimizi sağlayan katmanlardan biri de modeldir. Model, Controller dan aldığı veri tabanı isteklerini karşılayacak olan tabloları ve sütunları nesne olarak kullanır. Bu nesne olarak kullandıklarını da Controller ‘e gönderir ve bu işlem mantığı ile işler yürümeye devam eder.

Peki, hangi katman hangi katmana erişebiliyor.

İlk olarak en etkin katmanı söyleyelim. Bu Controller ‘dır. Controller hem model ‘e hem de View ‘a erişebiliyor.

Bir diğer katmanımız modeldir. Model ise sadece Controller ’a erişebilmektedir.

View katmanı ise web uygulamalarımızın görünen tarafıdır. Bu katman da yalnızca Controller ‘a erişebilmektedir. Model katmanına erişebilmesi mümkün değildir. Zaten MVC yapısının mantığını düşündüğümüz zaman oluşma sebeplerinin başında View ile model ‘i birbirinden ayırmak olduğunu söyleyebiliriz.

Kısaca toparlamak gerekirse, Controller bütün katmanlara erişebiliyor, model ve View ise yalnızca Controller ‘a erişebilmektedir.

Genel olarak MVC yapısına değinmiş oluyoruz. Şimdi ASP.NET MVC Framework ‘e değinmeye başlayabiliriz.


Yukarıda vermiş olduğumuz resimden de görebileceğiniz için ASP.NET MVC Framework model View ve Controller yapılarının birleşmesinden oluşmuştur. Daha önceden bu mimariyi kendimiz oluşturarak kullanabiliyorduk. Sadece ASP.NET ile değil Java ile yapmış olduğumuz web uygulamalarında da kullanmamız mümkündü. Fakat ASP.NET ile uygulama geliştiren yazılımların yaptıkları bazı yanlışlar vardı.

İlk olarak web uygulamalarında bütün adımlar tek tek işlenerek ilerlenmesi gerekmekteydi. Fakat asp.net ile bu mantık pek uygulanmamaktaydı. Çünkü diğer web uygulamalarında Button ’un click özelliğini nereden alacağını yanlış bile olsa biz belirlerken asp.net uygulamalarında sanki masaüstü uygulaması geliştiriyormuş gibi hareket ederek işlemlerimizi yapıyorduk. Bu tür web uygulamaları geliştirmek belli bir süredir bahsetmeye çalıştığımız MVC mimari yapısına aykırı yöntemlere yol açmaktadır. Bu durumların başında da Controller ile model ‘i birlikte tek bir sınıfında içerisinde kullanmaktı.

MVC Framework ile asp.net uygulamaları geliştirirken daha projeyi ilk açtığımız anda bizi karşılayan hoş sürprizler yer alıyor. Bunlardan bence en önemlisi Model, View ve Controller isimli dosyalar ve bu dosyaların içeriklerinde gerekli sınıflar ve web sayfaları yer alarak geliyor. Dosya sistemlerinin ve benzeri özellikleri birazdan ekran görüntüleri ile incelemeye çalışacağız.

MVC Framework ile ASP.NET uygulamaları geliştirmeden önce bilgisayarımızda kurulu olması gereken uygulamalara göz atalım;

İlk olarak tabii ki ilk olarak web uygulamalarını geliştirebilmemiz için Visual Studio 2008 veya Visual Web Express programlarından birinin yüklü olması gerekmektedir. Bu programlara Expression Web programını da eklemek isterdik ama maalesef şu anda MVC mimarisini otomatik olarak oluşturamıyor. Belki gelecekte sıralayacağımız listede bu programı da kullanabileceğizdir.


Bir diğer uygulama ise asp.net 3.5 Extensions CTP ‘sidir. Bu eklenti sayesinde Silverlight kontrollerinden AJAX kontrollerine kadar birçok kontrolü kullanabilmemize olanak tanıyor.


Sonuncu ve MVC için en önemli olanı ise ASP.NET MVC Preview ‘dır. Biz bu makalemizi Preview 2.0 sürümüne göre oluşturduk.


Bu uygulamaları kurduktan sonra Visual Studio ‘muzda nasıl bir uygulama geliştirmemiz gerektiğine göz atabiliriz.

MVC uygulaması geliştirebilmek için File-->New-->Project yolunu takip ederek C# bölümünde, web uygulamaları bölümünden ASP.NET MVC Web Application ‘u seçerek MVC uygulamaları geliştirmeye başlayabilirizdir.



Bu başlangıç öncesinde bize uygulamamızda ayrıca bir test projesi oluşturmak isteyip istemediğimizi soruyor. Bu işlem tamamen keyfidir. Kendi hazırladığım projede bunun olmasını istedim ve kabul ettim.



Uygulamamızı geliştirdikten sonra uygulama dosyalarının olduğu bölüme göz atarsak biraz önce bahsettiğimiz gibi bütün yapılar için ayrı ayrı dosya oluşturulmuş ve boş olarak sınıfları eklenmiştir. Ayrıca View klasörünün index ve about web sayfaları ile birlikte Master page ’de dahili olarak verilmiştir. Uygulama penceresinin ekran görüntüsüne göz atarsak daha akılda kalıcı olacaktır.



Uygulamamızın referanslarına bakmadan önce isterseniz uygulamamızı bir derleyelim. Bakalım en sade haliyle nasıl bir uygulamamız var.



Uygulamamız oldukça basit ve kullanışlı bir biçimde gözüküyor. Daha şu ana kadar herhangi bir kod yazımı veya işlem yapmadık. Şimdi ise hangi isim alanlarını kendisine referans ederek uygulamaları oluşturduğuna göz atalım.



Ekran görüntüsünde mavi ile seçili olan referanslara dikkat ettiyseniz Web.Mvc ve Web.Extensions yeni isim alanları olarak göze çarpmaktadır. MVC Preview 1.0 zamanında Web.Mvc isim alanı Web.Extensions ‘ın içerisinde bulunmaktaydı ve özellikler açısından şu an kine oranla oldukça kısıtlıydı. Fakat bu geçen zaman diliminde MVC ‘ye ilişkin sınıflar ve bu sınıflara ait özelliklerde arttırılmış ve ayrı bir isim alanı olarak belirlenmiştir. Bu isim alanının içeriği oldukça fazla olduğundan dolayı biz sadece bir kısmını gösterebiliyoruz. Eğer ki siz bütün sınıfları merak ederseniz bu isim alanının üzerine sağ tıklama ile Object Browser seçeneğine tıkladığınız da ayrıntılı bir biçimde bu sınıflara ve aldıklara değerlere ilişkin verilere ulaşmış olacaksınız.



Olukça uzun olan sınıf listesinden bir kısmına göz atmaya çalıştık. Şimdi ise web servis kontrol modellerinden olan ve yine uygulamamızla birlikte otomatik olarak oluşturulmuş olan Global.asax dosyamızın kod tarafında otomatik oluşturulan kodlara göz attığımızda ilk dikkatimizi çeken Regular Expression ile oluşturulmuş olan kod parçacığı çekecektir. Bu kod parçacığına ilişkin kodu aşağıdaki tabloda verdikten sonra kısa bir açıklamasında bulunacağız.

C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcAppMakale
{
   public class GlobalApplication : System.Web.HttpApplication
   {
      public static void RegisterRoutes(RouteCollection routes)
      {
         // Note: Change the URL to "{controller}.mvc/{action}/{id}" to enable
         // automatic support on IIS6 and IIS7 classic mode

         routes.Add(new Route("{controller}/{action}/{id}", new MvcRouteHandler())
         {
            Defaults = new RouteValueDictionary(new { action = "Index", id = "" }),
           });


         routes.Add(new Route("Default.aspx", new MvcRouteHandler())
         {
            Defaults = new RouteValueDictionary(new { controller = "Home", action = "Index", id = "" }),
         });
      }

      protected void Application_Start(object sender, EventArgs e)
      {
         RegisterRoutes(RouteTable.Routes);
       }
   }
}

Yukarıda vermiş olduğumuz kod parçacığında koyu renkli olarak vermiş kodlar uygulamanın Controller içeriğini doğru kullanmasını ve tek sonuç getirmesini sağlayan bölümdür. Bu kod bölümünde icerik/olay/id biçiminde alırsak aslında daha doğru bir şekilde tanımlamış oluruz. Bu istisna yapılar Mvc ’nin en büyük kazançlarından biri olan Route sınıfını kullanarak yönlendirme işlemlerini rahatlıkta yapabilmesine olanak tanımaktadır. Bu yönlendirme işlemleri Controller sınıfının içerisindeki id ‘lere bağlı olarak gelen istekler doğrultusunda olmaktadır.

Bize sunulmakta olan bu kod basit uygulamalar için oldukça yardımcı olmaktadır. Fakat daha kapsamlı uygulamalar düşünüldüğünde bu yönlendirme yapısı maalesef yetersiz kalacak ve bizim yeni yönlendirmeler belirmemiz gerekecektir.

Değinmemiz gereken bir başka noktada uygulamanın başlangıç sayfasını yine yönlendirmeler ile tayin edebiliyor olmamızdır. Bu yöntemde yukarıdaki kod bloğunda yer almaktadır.

View katmanında otomatik olarak oluşturulan web sayfalarının hangi içeriklerle ve nasıl oluşturulduklarına göz atmak gerekirse,

index.aspx ve about.aspx sayfalarının share klasörünün altında olan master page üzerinden türetilmiş oldukları gözümüze çarpmaktadır. Bunu anlamanın en kolay yoluna sayfamızın aspx kod bölümünde ContentPlaceHolder ‘ı görmektir. Bu kod parçacığı sayfanın içeriğini kullanacak olduğumuza ve diğer bölümlerini bir taslaktan çekeceğimizi bize bildirmektedir.

Bakmadığımız tek Controller kaldı. Controller katmanında ise bütün yönlendirme ve sorgulama gibi işlemlerin yapılması amaçlanmıştır. Yeni açılan projede bize verilen sınıflarda da oluşturulan ilk kodlar son kullanıcıdan gelen isteklere göre View ‘da bulunan sayfalara yönlendirmek biçiminde olmuştur. Bu yönlendirmelerden birine BreakPoint koyarsak istek yapılan sayfa açılmayacak ve bizim kodlar üzerinde dolaşmamızı bekleyecektir. Şimdi bu debug olayına ve çağırılan sınıflara göz atalım.



Uygulamamız derlediğimiz de ise çağırılan sınıflara göz atarsak,



biçiminde olduğunu görürüz. Resimde yer alan durum çubuğu internet tarayıcımızdan alınarak resme eklenmiştir. Koyulmasının amacı ise debug esnasında Controller dan dahi olsa web sayfasının görüntülenmesini bekletebileceğimizi göstermektedir. Burada uygulamamız debug esnasında bekletilirken sınıflara baktığımızda MVC için olan sınıfların dışında http ve Visual Studio ile ilişkin sınıfların olduğu gözden kaçmamaktadır.

Bu debug işlemine devam ettiğimizde site.Master ‘a giderek hangi sayfaya istek olduğuna bakıyor action link değerini ön belleğine alıyor. Bu ön bellekle tuttuğu sayfa kodunu tekrar controller ile doğrularak sayfanın görüntülenmesi sağlanıyor. Bu işlemler yapılırken ön bellekte tutulan action link global.asax içerisinde yer alan regular Expression lar yardımı ile id lerden yararlanır ve işlemi gerçekleştirir.

İlk etapta karmaşık görülse de daha sonrasında karışılacağınız performans ve kolaylık gibi faktörler sayesinde bu mimari oldukça hoşunuza gidecektir. Çünkü anlatmaya çalıştığımız bu yöntemler yıllardır web uygulamalarında harici olarak uygulanmaya çalışıyordu. Fakat hiçbir zaman tam bir taslak içerisinde biz geliştiricilere sunulmamıştı. Biz de MVC Framework ile gelen yenilikleri oldukça erkenden kullanmamız ve uygulamalarımızda yer alan bağlantıları ve benzeri işlemleri yaparken harcadığımız zamanı en aza indirgemiş olacağız.

Yukarıda verdiğimiz bilgiler ışığında temel olarak MVC Framework ‘ü tanımış oluyoruz. Bir sonraki makalemizde ise MVC Framework ‘te değinmemiş olduğumuz model katmanına LinQ to SQL ile yapacağımız veri tabanı örneği ile değinmeye çalışacağız.

Umarım yararlı olmuştur.

İyi çalışmalar…

Uygulamanın kaynak kodlarına download bölümünden erişebilirsiniz.

Turhal Temizer
http://turhal.blogspot.com
Uygulamanın kaynak kodları