Makale Özeti

Bu makalede MVC framework'un bize sundugu genisletme noktalarindan biri olan ViewFactory'leri kullanacagiz

Makale

ASP.NET MVC framework'u genisletmek -1

ASPNET MVC Framework'un decoupled(ayrik) yapisi bizim uygulamalari test etmemizi kolaylastirdigi gibi onu gelistirmemize de olanak veriyor. Buna ornek olarak WebForms syntaxindan kurtulup daha onceden bildigimiz, alistigimiz template engine'i kullanabilir veya istedigimiz IoC container'ini controllerlari cozumlemek icin kullanabiliriz.

Ben bu makalede ikisine de ornek yapacagim. Template engine olarak monorail'den alisik oldugum nvelocity yi ve IoC olarak da bagimlisi oldugum Windsor'u kullanacagim.

  • ViewFactory yaratmak
    ASP.net MVC framework ile sevdigimiz bir template engine'i kullanabileceigimizi soylemistik. Java'cilarin bildigi Velocity engine gibi bir seyi frameworkumuzle kullanmanin ne kadar kolay oldugunu ornekle goreceksiniz. Ben her ne kadar ustunde calistigim projede webforms view engine kullaniyor olsam da kisisel tercihim nvelocity. Bunun arkasinda yatan temel neden Webforms'un typesafe olmakta israrli olmasi. Bu nedenle anonim tipleri kullanmaniza imkan yok reflectionla almak disinda. Ayrica web sayfasi icinde her seferinde <% ve %> yazmak, makarna kod diye tabir ediyorlar, hele isin icinde casting islemi de varsa cileli bir hal aliyor.

    Ornek verecek olursam:
    Webforms'la

    yazmak yerine

    NVelocity ile

    yapabilirsiniz. Bu belki size dinamik dillerden tanidik gelecektir. Cast etmeye ihtiyac duymadan alt alanlarina erisebiliyoruz. Temelde template engine'lerin hemen hepsinin yaptigi is benzer. Belirledikleri belirli bir syntaxi size kullandirarak hazirladiginiz tema/template'i verdiginiz verilerle dolduruyorlar. Yukaridaki ornekte $post.Title template elemani ve bizim bu temaya gececegimiz Post nesnesi, template engine tarafindan islenir ve $post.Title "Merhaba Dunya" ile yer degistirilir.

    Gelin simdi bu nasil olacak onu gorelim

    Once yeni bir class library acalim ve adini MVCExtensions koyalim


    Projemize referans olarak System.Web.Extensions'u ve NVelocity.dll i verelim.


    Daha sonra ViewFactories diye bir klasor acip icine NVelocityViewFactory classini ekleyelim ve bu class'in IViewFactory'yi implemente etmesini saglayalim. IViewFactory ASP.net MVC Frameworkun belirledigi ViewFactoryler icin bir kontrat. Bunu implemente eden herhangi bir sinif potansiyel view factory olarak kullanilabilir.

    Bu interface bizden tek bir method istiyor, CreateView. Bu methodu Hamilton Verossimo asagidaki sekilde duzenlemis, degistirmeden aktariyorum



    Tabi burada daha onemli kisim NVelocityView sinifi, onun da kodlarini asagida veriyorum



    Simdi de ornek uygulamamizi yazalim. Ben asp.net mvcnin default uygulamasini yazmayi uygun buldum, tabi biraz degistirdim. Bunun icin oncelikle BaseController diye bir sinif olusturup bunun viewFactory'si olarak NVelocityViewFactory'yi belirttim. Her ne kadar kotu bir pratik olsa da su anda daha basite indirgemek icin yapiyorum. Daha dogru bir yaklasim kesinlikle IoC kullanip bunun disaridan enjekte edilmesi veya uzantiya gore karar verilmesi olabilirdi.



    Ve varsayilan olarak gelen HomeController'i demo amaciylabiraz degistirdim.



    Aslinda iki action da ayni seyi yapiyor: Anonim tipi view'a veri olarak geciyor.



    Bu da ornek view kodumuz. Anonim tip gondermemize ragmen reflection kullanmamiza gerek olmadan duck typing yapabildik.