ASP.NET - MVC Framework - I

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 linkten erişebilirsiniz.

Yorum Gönder

0 Yorumlar

Ad Code

Responsive Advertisement