|
Asp.Net MVC Framework - I |
|
Gönderiliyor lütfen bekleyin... |
|
|
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)
yapısı yıllardır web uygulamalarında kullanılmaktadır. Kullanım amacı ise internet
sayfalarındaki hızı sağlamaktır. Daha önceden hazırlamış olduğunuz web
uygulamalarında yapmış olduğumuz hataları hatırlamak için yeniden değinmeye
çalışalım. Web sayfalarımızın kodlarını hazırlarken şu hataları sıkça
tekrarladığımız gözlemlenmiştir. Veri tabanı, yönlendirme ve diğer bir çok
işlemi son kullanıcı tarafından görülecek olan sayfasının arka plan
kodlarına yazar ve işlemimizin bittiğini düşünerek web sayfamızı
tamamlardık. Fakat zaman içerisinde web sitelerimizin kullanıcı sayısı
arttıktan ve sitemizin içeriği genişledikten sonra sayfanın görüntülenmesi
ile ilgili sorunlar yaşamaya başlayacağız. Eğer ki bütün işlemlerimizi
görünen sayfamızın içerisinde yaptıysak bu tür sorunlar ile karşılaşmamız
kaçınılmaz bir gerçektir. Şimdi MVC mimarisini kullanmadan gerçekleştirmiş
olduğumuz projelerin zaman içerisinde ne tür sorunlar ile
karşılaşabileceğimizi madde madde değinmeye çalışalı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 sebeplerine değinmeye
çalışalım.
İlk sorunumuz, son kullanıcının kullanmış olduğu mevcut internetin hızının
yavaş olmasıdır. Bu teknik sorunu son kullanıcıya yaşatmamak için görünen sayfalara minimum düzeyde veri tabanı ve yönlendirme kodları
kullanmak olacaktır.
• 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ı hosting
şirketi tarafından bize söylenen sayıdan az çıkabilir. 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 bu sayıdan az aktif kullanıcıda kullanılamaz
hale gelebiliyor. 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şturmuş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
erişmemiz için sınıfları hazırlıyoruz. En sonunda
görünen sayfamızın 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 yapılması sağlayan
kod blokları olacaktı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ı
sıralayalım. • Kod güvenliği • Anlaşılabilirlik
• Okunabilirlik • Yönetilebilirlik
• Yenilenebilirlik
ve benim aklıma gelmeyen daha nice
kazancı sıralayabiliriz. Katmanlara ayrılarak yapılan uygulamların kazançlarını 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 sağlamış oluyoruz. Aynı şekilde bizim başka zaman
dilimlerinde çalışacak olduğumuz 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. MVC yapısının nasıl bir mantıksal düzen ile çalıştığını
aşağıdaki görüntüden inceleyebiliriz.
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.
MVC
yapısının katmanlarını ayrı ayrı tanımladık. MVC
Framework ile ilgili ayrıntılı bilgilere değinmeyen önce MVC mimarisi üzerinde değinilmesi gereken
bir nokta daha var. Hangi katmanın hangi katmana erişip erişemediğini
bilmemizdir. Bunu neden bilmemiz gerektiğine gelirsek. Sebebi programlamayı yaparken
daha rahat hareket edebilmemiz ve MVC mantığından sapmadan uygulamalarımızı
geliştirebilmemiz içindir.
Yukarıda vermiş olduğumuz MVC mimarisi
resimden
yararlanarak anlatmaya çalışalım. İnternette yayınlanmakta olan sistemimize
kullanıcıdan istek geldiği andan itibaren adımsal olarak inceleyelim. İlk olarak kullanıcı
sayfaya girerek bir form kontrolü üzerinden isteğini yapıyor. Controller ‘e gelen
bu istek kendi bünyesinde
bulunan Business sayesinde işlemlerin işlerin yapılabilmesi için gerekli
olan sınıflara yönlendirilmesi sağlanır. Genellikle MVC
yapılarını veri tabanı işlemlerini web sayfalarımızda daha rahat yapabilmek 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. 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 kullanmamıza olanak tanır. Nesne olarak bu veriler kullanıldıktan
sonra tekrardan Controller a gönderilerek işlemlerimizin yapılmasına devam
edilcektir.
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.
Model veri tabanı işlemlerimizi yapabildiğimiz katmandır.
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üzde 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şebiliyorken, View
ise yalnızca Controller ‘a erişebilmektedir.
Genel olarak MVC yapısına
değinmiş oluyoruz. Artık ASP.NET MVC Framework ‘e değinmeye başlayabiliriz.
Yukarıda vermiş olduğumuz mimari görüntüden de görebileceğiniz gibi ASP.NET MVC Framework
Model View ve Controller yapılarının birleşmesinden oluşmuştur. Daha önceden
bu mimariyi benzer yapıları 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ı.
Web uygulamalarında bütün adımlar tek tek işlenerek ilerlenmesi
gerekmektedir. 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çacaktır. Ayrıca yapılan başka bir hata ise Controller ile Model ‘i tek
bir sınıf içerisinde yer verilmesdir.
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 olmasıdır. 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 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 verebiliriz.
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ınıyor.
Sonuncu
ve MVC için en önemli olanı ise ASP.NET MVC Preview ‘dır. Normalde asp.net
3.5 Extensions CTP ’sini kurduğumuz zaman MVC ’nin ilk preview sürümü de
bilgisayarımıza yüklenmiş oluyor. Fakat bu sürümde bir sonraki çıkan
sürümüne oranla eksiklikler olduğu için biz bu makalemizi
Preview 2.0 sürümüne göre oluşturduk.
Bu
programları ve eklentileri 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şlayabiliriz.
Bu başlangıç öncesinde bize uygulamamızda ayrıca bir test projesi
oluşturmak isteyip istemediğimizi soruyor. Bu işlem tamamen keyfidir.
Yazımız için hazırladığımız örnek projede test projesinin oluşmasını da
kabul ederek devam ettik. Sizler isterseniz bu bunu kabul etmeye de
bilirsiniz.
Uygulamamızı
oluşturduktan 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ı derleyelim ve
en sade haliyle nasıl bir uygulamamız olduğuna göz atalım.
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,
Web.Routing 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 bizlere sunulmuştur. 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 göz atabilirsiniz ve ayrıntılı bir
biçimde bu sınıflara ve aldıklara değerlere ilişkin verilere ulaşabilirsiniz
Olukça uzun olan sınıf listesinden bir var. Şimdi
ise web servis kontrol modellerinden Global.asax dosyamızın kod
tarafına göz attığımızda ilk dikkatimizi çeken
Regular Expression ile oluşturulmuş olan kod parçacığı çekecektir.
Global.asax ’a ilişkin C# kodunu aşağıdaki tabloda veriyoruz.
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ıdaki tabloda 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 controller/action/id
bölümünü denetleyici/olay/id biçimde Türkçeleştirirsek daha
akılda kalıcı olacaktır. 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.
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
istisna yapı uygulamalarımızda oldukça yardımcı olacaktır.
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 ‘ı bulmamızdır.
Uygulamamızda yeni web sayfaları eklemek istediğimizde ise NewItem ile
karşımıza çıkan menünden MVC content page i seçerek ekleyebilmemiz
mümkündür.
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. 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. Ön bellekle tuttuğu sayfa kodunu tekrar controller da doğrulayarak
sayfanın görüntülenmesini sağlı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ışılı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.
Turhal Temizer
http://turhal.blogspot.com
Makale:
Asp.Net MVC Framework - I ASP.NET Turhal Temizer
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|