Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Turhal Temizer
Turhal Temizer
http://www.turhaltemizer.com
İletişme geçmek için tıklayın.
92 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: asp.net controller deginmeye framework hosting islemlerimizi kullanici olacaktir. oldugu sayfalarinin siniflara sirketi tabani uygulama uygulamalari ASP.NET Turhal Temizer
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : ASP.NET
Yayınlanma Tarihi : 19.3.2008
Okunma Sayısı : 42214
Yorum Sayısı : 8     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 27.12.2024
Turhal Temizer
Mac OS/X Removing CUDA 27.12.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak 27.12.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 27.12.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Asp.Net MVC Framework - I
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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
  • Yazılan Yorumlar
  • Yorum Yaz
MAR
29
2008
Saniyorum ki MVC patterni yanlis anlamissiniz Model ise sadece controllera erisebilmektedir demissiniz, bu yanlis. Model sadece modeldir, bir yere erisimine olanak verilmez. Controller modele istek yapar ve istedigini alir, sonra bunu viewa gecer. Viewin ise controllera erisip erismemesi tercih meselesidir ve alt patterndir.
MAR
24
2008
Hatalar düzeltilmiştir. İlginiz için ve uyarınız için teşekkür ediyorum...
MAR
22
2008
benim eleştri yazım yanlışlarrı olduğu için makalede okumakta zorlandım. ve de ayrıca düşük cümleler varlığı da olamasaydı iyi olurdu. Bakın, ne kadar kötü bir yazım değil mi? =] Eleştirim makaledeki yazım tarzı ile ilgili olacak. Çokça yazım yanlışı ve düşük cümlesi olan bir makale.
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • 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