Bu makalede sizlere MVC mimari paterninin kısa tarihi, ne olduğu, çalışma mantığının nasıl tasarlandığı ve ASP.NET icerisine entegre edildiğinde bir web sitesi geliştirme teknolojisi olarak ne gibi bir yapıya sahip olduğu,daha eski web sitesi geliştirme teknolojilerine göre bize ne gibi kolaylıklar sağladığıyla ilgili bilgiler veriyor olacağım.
MVC mimari paterni ilk olarak Model-View-Controller paterni olarak, 1978 yılında Trygve Reenskaug isimli Norveç’li bilgisayar bilimcisi tarafından tanıtılmıştır.Bu tarihten itibaren birçok ek paterne esin kaynağı olmuş ve MVP(Model View Presenter),HMVC(hierarchical model-view-controller) gibi mimari paternlerin türediği temel yapı haline gelmiştir.
MVC, görsel arayüz (GUI-Graphical User Interface) uygulamalarını sorumlulukların ayrılması prensibini ele alarak kullanıcıya sunan bir paterndir. Bahsedilen ‘sorumlulukların ayrılması’ prensibi MVC için çok önemlidir. Bu sistemde uygulama üç ana parçaya ayrılır: veriyi karşı tarafa çeşitli formlarda sunabilmek(sergileyebilmek)/temsil edebilmek sorumluluğunu üstlenen View,kullanıcı etkileşiminden gelen eylemleri yönetme sorumluluğunu üstlenen Controller ve verilerimizi entegre edeceğimiz, uygulamamızla ilgili bilgileri tutmakla sorumlu olan Model.
Controller yapısı bu sistemde hem Model hem de View üzerinde çalışır. Model yapısına giden isteği yönetmek ve veri değiştiği zaman View yapısını güncellemekle yükümlüdür. View yapısı modelin barındırdığı bilgiyi görsele döker, Model yapısı ise veriyi barındırmakla beraber veri değiştiğinde Contoller’i güncelleme mantığını da içinde tutabilir.
Eğer MVC mimarisini baz alan iyi tasarlanmıs bir uygulama yasmak isteniyorsa dikkatli olmak gerekir. Çünkü kötü kararlar verilirse çalışma prensiplerinin dışına çıkmak çok kolaydır. Bu kötü kararlar genellikle View ve Controller yapılarının sorumluluğunun en ufak detaylara kadar kesin bir şekilde belirtilmemesinden kaynaklanır. Aynı zamanda bu parçaların birbirleriyle haberleşme mekanizmalarının güzel bir şekilde tasarlanması gerekir.
MVC paterni bir dile veya platforma özgü değildir. İş mantığı dil bağımsız bir şekilde her türlü uygulamada kullanılabilir.
Microsoft, ASP.NET MVC olarak 31 Mart 2009’da bu paterni bir web geliştirme teknolojisi olarak bünyesine katmış oldu. Önceden kullanılan ASP.NET Web Form’a göre büyük performans sağlayan ve kolaylıklar getiren ASP.NET MVC kısa sürede web sitesi geliştirmek için tercih edilen bir teknoloji haline geldi.
Aslında kökenine bakıldığında MVC Famework’u web uygulaması geliştiricilerin aşina olduğu bir yapıda hazırlanmıştır. Web Form’a göre en önemli farklılıklarından bir tanesi ViewState yapısının ortadan kaldırılmış olmasıdır.ViewState yapısı bir yandan sayfadaki bilgilerin yok olmasını engelleyerek bir Post durumunda bilgileri saklayabiliyor olsa da yönetilmesi çok hassas bir yapı olduğundan dolayı bizi web sayfalarının performansını düşüren bir sürece sokabiliyordu. Performans ise ASP.NET icerisine bir Framework olarak girdiğinden beri en önemli kıstaslardan biri haline geldi. Dolayısıyla ViewState’in kaldırılması ve bunun yerine DataTransfer gibi belirli nesnelerin getirilmesi uygun bir çözüm olarak görüldü.
Aynı zamanda benzer sayfalar sürekli tekrarlanacaksa ya da bir sayfa üzerinde veritabanından gelen veriler olacaksa sayfa gösterimlerinde tek tek sayfa oluşturmak yerine QueryString yapısı kullanılarak oluşturulan tek sayfa üzerinden birçok sayfa oluşturulmuş gibi kullanılabilme durumu sağlanmıştır. Bu yapının geliştirilerek hazırlandığı bir web sitesinin sayfalarında N-Tier benzeri ancak katmansaldan ziyade modüler bir mimari kullanılmış oluyor. Bu benzerliği açıklama web teknolojisi olarak MVC paterninin kullanılması durumunu zihnimizde daha da somutlaştıracaktır.
Çok büyük ölçekli olmayan bir kurumun web sayfasını hazırlayan bir yazılım geliştirici düşünelim. Bu geliştiricinin elinde site şablonları vardır(Ana Sayfa,Hakkımızda vs..) Eğer karşı taraftan gelen istek alt sayfaları da içerirse normal şartlar altında tek tek sayfa oluşturmaya başlanır ve statik bir site oluşmuş olur. Fakat zaman içerisinde bu siteye yeni eklentiler yapılmak istendiği takdirde geliştirici tekrar sayfa eklemek zorunda kalacaktır. Bu, geliştirmeye pek uygun bir yapı değildir. Bu tarz sistemler zaman içerisinde başka kişiler tarafından tekrardan geliştirilmek istendiğinde sayfaların yeniden hazırlanması gerektiği gerçeği ortaya çıkacaktır. Bu gerçek karşısında da yine bir katmansal mimari ile uygulama tekrar geliştirilir ve belirlenen kriterler doğrultusunda büyütülebilir bir web sayfası hazırlanır. Tabii ki bu tür bir web sayfasının maliyeti ufak kurumlar zorlamaktadır. İşte bu noktada MVC Framework ufak maliyetlerle mimari yapıyı kullanarak uygulama geliştirmemizi sağlayan bir ürün olarak karşımıza çıkar.
Şimdi Model,View ve Controller yapılarını ASP.NET MVC Framework içerisindeki sorumlulukları ile açıklayalım:
Model: Uygulamaya mantık olarak eklenecek veri katmanımızdır. Veritabanı işlemlerimiz için tablolarımızı/eger Code First yaklaşımını izliyorsak sınıflarımızı,Entity Modellerimizi ve Context sınıfımızı barındıran yapımız.
View: Kullanıcı kontrollerinin, bileşenlerinin gösterildiği ve kullanıcının gördüğü katmandır. Genel olarak model katmanı üzerinde yer alan tablo kolonlarına uyum sağlayacak şekilde oluşturulur. Genel yapısı dışında ASP.NET uygulamalarında da yapabildiğimiz tasarımsal öğeleri barındırarak(css,resim,javascript kodları) zengin web uygulamaları oluşturabilmemize olanak sağlar.
Controller:View katmanı üzerinde yapılan işlemler sonucunda kullanıcının hangi sayfaya yönleneceğine,ya da veri tabanı üzerinde işlem yapıp yapmayacağına ilişkin mantığın tutulduğu modüldür.
MVC Framework kullanılarak geliştirilmiş uygulamalar kompleks(iş mantığı,kullanıcı arayüzü,veri erişimi katmanı gibi) yapıda oluşurlar. Bu yapı ile geliştirilen uygulamalar en temel web sayfalarını dahi bir katmansal mantığa büründürürler.
Visual Studio içerisinde bir MVC projesi açtığımız zaman proje dosyamızda oluşan klasörleri açıklamamız gerekirse;
AppData: Web sayfamızda kullanacak olduğumuz fiziksel veri tabanı dosyasını eklediğimiz modüldür. Örnek vermemiz gerekirse SQL Express,SQLITE gibi dosyalar bu türlerden biridir.
Content: Web sayfamızda kullanacak olduğumuz style sheet,resim v.b. dosyaları tuttuğumuz klasör.
Models:Veri tabanını tutan,Entity nesnelerimizi barındırdığımız modül.
Controller: Kullanıcıdan gelen istekleri alarak gerekli modüllere gönderir ve tekrar kullanıcıların görmesi için view katmanına gönderir. HomeController için düşünmek gerekirse, ana sayfada ne tür yazılar ya da veri tabanından verilerin nasıl gösterilmesi gerektiği Controller’da belirlenir. Hangi istek sayesinde oluşturmuş olduğumuz modele gidileceğine ve hangi işlemin yapılacağına dair karar bu modülde verilir.
Views: Son kullanıcının göreceği sayfaların bulunduğu klasördür. Sayfalarımızın ortak olarak kullanacağı dosyalar Shared isimli klasörün içerisinde açılır. Ana ekrana ilişkin işlemler yapmak istiyorsak Home klasörünün içerisine ekleyebilmemiz mümkündür. Ayrca oluşturmuş olduğumuz web sayfalarını sıfırdan kendimiz oluşturabilmekle birlikte model katmanında oluşturduğumuz sınıflara göre Controller üzerinden yaptığımız işlemler doğrultusunda otomatik olarak modelimize bağlı sayfalar oluşturabilmemiz de mümkündür(scaffolding işlemi bu yönteme denir).