Anasayfa RSS Email

August 2009 Entries

ASP.NET MVC ilk proje ve proje yapısı

Yeni bir ASP.NET MVC projesi oluşturmak

asp.net/mvc/download adresinden mvc framework kurulumunu indirip kurduktan sonra, VS 2008'de new project seçeneğini seçtiğiniz de ASP.NET MVC Application seçeneğinin belirdiğini göreceksiniz.

File>New Project seçeneklerinden ASP.NET MVC Application seçip yeni bir asp.net mvc framework projesi oluşturalım ve proje template ile beraber gelen yeni dosyaların neler olduğuna bakalım.



Yukarıdaki resim de ben de ASP.NET MVC 2 Application da gözükmektedir. Bu proje türü daha önceki makalemde bahsettiğim ASP.NET MVC 2 Preview 1 sürümü ile gelen proje türüdür. Proje tipi adında ki versiyon numarası sayesinde iki proje tipi de aynı bilgisayarda çalışabilmektedir.





Content klasörü özel bir klasör değildir template projesi içersiinde yer alan .css dosyasını koymak için tercih edilmiş bir klasördür. Sizde kendi .css vb. dosyalarınız için kullanabilirsiniz ya da silebilirsiniz.
Scripts klasörü özel bir klasör olmamak ile beraber içerisinde Microsoft'un ajax javascript kütüphaneleri ve artık resmi olarak da Microsoft'un desteklediği ve kullandığı jQuery kütüphaneleri yer almaktadır. -vsdoc ifadesini içeren .js dosyaları production da çalışmak için değil Visual Studio'da javascript kodlarını yazarken jQuery için intellisense sağlamak için Visual Studio tarafından kullanılmaktadır. (daha önceki blog yazılarımdan birisinde bundan bahsetmiştim)

Controllers klasörü her bir controller sınıfı burada oluşturulur ve oluşturulmuş routing table sayesinde asp.net uygulamanıza http ile ulaşan istekler ilk olarak buradaki sınıflardan uygun olanı bulur ve reflection ile bir instance oluşturur ve controller sınfı içerisinde istek yapılmış olan method invoke eder(çağrırır). Bu method kendi içerisinde işleri yaptıktan sonra bir "ActionResult" dönerek view katmanına geçer ve kullanıcı arayüzünün oluşturulmasını bu şekilde sağlar.

Views klasörü ASP.NET MVC Framework default viewengine tarafından view dosyaları olarak kullanılan .aspx, .ascx dosyalarını aramak için kullanılan klasördür. Bu klasör içinde Shared adında yer alan klasör tüm controllerlar tarafından kullanılan ortak view dosyalarını içermektedir. Views klasörünün içerisine her controller için bir klasör açılmalı ve her .aspx sunan her controller action method için bir view (istisnalardan ayrıca bahsederiz.) dosyası oluşturulmalıdır.

Örneğin yukarıda ki örnekte HomeController sınıfı içerisinde ki Index methodu için istek yapıldığında Index.aspx içerisinde yer alan markup görüntülenecektir.

Shared klasörü içerisinde Site.Master adında bir master page oluşturulmuş durumdadır. Tüm ASP.NET MVC projeleri ilk açıldığında burada gördüğünüz standart master page ile açılır. İsterseniz bunu kendiniz değiştirebilirsiniz ya da hazır bir şeylere ihtiyacınız var ise asp.net/mvc/gallery adresinden çeşitli hazır templateler elde edebilirsiniz.

Hazır olarak gelen projeyi çalıştırın inceleyin ve koyduğunuz breakpointler ile hangi methodun hangi adrese istek yapıldığında çalıştırıldığını gözlemleyin.

Yeni sayfa oluşturmak adına öncelikle şunu yapalım. Controller klasörü altına PersonelController adında yeni bir sınıf ekleyin, ama bunun için standart şekilde add new class diyerek dosya ekleyebileceğiniz gibi ASP.NET MVC Project Template sayesinde gelen Add Controller menu seçeneğini kullanarabilirsiniz.





Controllers klasörüne sağ tıklayın açılan menüden Add>Controller seçeneğini seçin. Açılan kutuya PersonelController yazın, alttaki checkbox'i işaretlediğiniz de sizin için bazı hazır boş methodlar oluşturacaktır. Bir Personel ekranında standart CRUD işlemlerini yapacaksanız bu checkbox işaretlendiğinde oluşturulan methodların önceden eklenmesi sizin hızınızı artıracaktır.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication1.Controllers
{
    public class PersonelController : Controller
    {
        //
        // GET: /Personel/

        public ActionResult Index()
        {
            return View();
        }

    }
}


Yukarıdaki gibi bir PersonelController oluşturuldu şimdi başka hiç bir şey yapmadan uygulamayı çalıştırın ve <localadresiniz>/Personel/Index şeklinde çalıştırın.

ASP.NET'in şu ünlü sarı hata ekranı geldi. Ve hata mesaı aşağıdaki gibi;

The view 'Index' or its master could not be found. The following locations were searched:
~/Views/Personel/Index.aspx
~/Views/Personel/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException: The view 'Index' or its master could not be found. The following locations were searched:
~/Views/Personel/Index.aspx
~/Views/Personel/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx

Görüldüğü üzere MVC Framework biz action method içinden return View(); şeklinde geri dönüş yaptığımız anda öncelikle Views/Personel klasörü altında daha sonra ise Views/Share klasörü altında Index markup dosyasını aramaktadır. Buradan da anlaşılacağı gibi ilgili klasöre gidip markup dokumanımızı ekleyelim.

Views klasörü altına Personel adında bir klasör ekleyelim ve Personel klasörüne sağ tıklayıp Add>View menü seçeneğini seçelim.



Yukarıdaki Add View penceresinden gözüktüğü gibi Index adında bir view oluşturuyoruz. Bu şekilde eklendiğinde Index.aspx olarak eklenecek, eklenen view'in partial view olması için yani .ascx dosyası olması için ilk checkbox işaretlenmelidir. Strongly Typed view seçeneğini işaretlediğiniz de aşağıda ki listelerde uygulama içinde ki Model olarak kullanılabilecek sınıflar listelenir. Veritabanın da personel adında bir tablonuz olması ve model tasarımınızda da bununla eşleşen bir domain nesneniz (basit haliyle bir personel sınıfı) olması durumunda bu seçeneği işaretleyebilirsiniz.

Eğer strongly-typed view olarak eklerseniz aktive olan View Content listesinde ise Create,Details,Edit,List ve Empty seçenekleri belirir. Empty dışındaki bir değeri seçtiğiniz de duruma uygun html markup kodlarını içeren bir .aspx sayfası oluşturulur. Input kontrollerini ekleyen basit bir personel kaydı oluşturma formu gibi bir çıktı vermektedir. Ve işinizi hızlandırabilir.

Yukarıda ki seçenekler ile bir view ekleyelim.

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Index</h2>

</asp:Content>


Yukarıda ki markup kodları eklenen Index.aspx içeriğidir. Master page den gelen iki adet Content kontrolü vardır. İçeriği oluşturacağımız Content iki içerisine istediğinizi ekleyebilirsiniz. Content2 içerisini aşağıdaki şekilde değiştirin.

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2><%=ViewData["PersonelAdSoyad"] %></h2>
    Erişim<br />
    <%=ViewData["PersonelTelefon"] %><br />
    <%=ViewData["PersonelEPosta"] %><br />
</asp:Content>

Ve PersonelController içerisine geçip Index methodu aşağıdaki şekilde değiştirin.

 public ActionResult Index()
{
            ViewData["PersonelAdSoyad"] = "Cengiz Han";
            ViewData["PersonelEPosta"] = "cengiz[@]cengizhan[.]com";
            ViewData["PersonelTelefon"] = "05067750775";
            return View();
}


Uygulamayı çalıştırın ve Persone/Index urlini çağırın.



Yukarıdaki kod bloğunda kullanıcı isteği yaptığı anda PersonelController sınıfından bir instance yaratılır ve Index methodu çağrılır. Burada ViewData içerisine key'ler vererek bazı değerleri kaydettik. Bu yöntem Controller'dan View katmanına veri geçmek için kullanılır. Ve Index.aspx içerisinde ise bu ViewData bilgilerini okuduk ve ekrana yazdırdık.


Sonraki makalelerimiz de MVC Routing, Strongly-Typed View, kullanıcı girdilerini almak ve oluşturmak gibi konuları inceliyor olacağız.

rss adresim

Syndication aktivitelerini/trafiğini feedburner üzerinden takip etmeye başlayacağım. blogumu rss syndication üzerinden takip eden arkadaşlar lütfen rss adreslerini http://feeds.feedburner.com/hancengiz olarak güncellesinler, sağ üst köşede ki linki de feedburner linkine çevirdim.

ASP.NET MVC Framework'ü tanımak ve çalışmaya başlamak

Nedir? Ne zaman çıktı? Sürümleri? Nasıl Kullanılır?

.NET Framework ile ilk günden itibaren web uygulamları geliştirmek için ASP.NET WebForms kullanılmaktaydı. ASP.NET WebForms alt yapısının genişleyebilir yapısından faydalanarak geliştirilmiş açık kaynak kodlu ya da ticari MVC alt yapıları mevcuttu.Farklı platformlarda ya da open source bazı projelerde MVC tasarım kalıbı deneyimine sahip yazılım geliştiriciler tarafından Microsoft'dan MVC tasarım kalıbı desteği istenmekte ve beklenmekte idi. Microsoft bu bekletiye karşılık Microsoft Ekim 2007'de ASP.NET MVC Framework'den bahsetmeye başlatı (http://weblogs.asp.net/scottgu/archive/2007/10/14/asp-net-mvc-framework.aspx) ve 2009 Nisan'ında da ASP.NET MVC Framework 1.0 release sürümü duyuruldu. (http://weblogs.asp.net/scottgu/archive/2009/04/01/asp-net-mvc-1-0.aspx)

ASP.NET Framework 1.0 ile bir çok web sitesi/uygulaması geliştirildi. Ve Microsoft web uygulaması geliştirme kanadında ki bilinen isimlerinin blogları ve twitter gibi iletişim araçları ile MVC Framework üzerinde ki desteklerinin devam ettiği gözlemlenirken Microsoft ASP.NET MVC Framework 2'nin Preview 1 sürümünü duyurdu. (http://weblogs.asp.net/scottgu/archive/2009/07/31/asp-net-mvc-v2-preview-1-released.aspx)

ASP.NET MVC Framework 1.0 ile 2 (evet 2.0 değil) birlikte çalışmaktadır. Yukarıda verdiğim linklerde verilen nasıl kurulur bilgilerini tekrar etmek niyetinde değilim. Visual Studio üzerine http://www.asp.net/mvc/download/ adresinden setup dosyasını indirerek yada Microsoft Web Platform Installer aracılığı ile kurabilirsiniz.

Microsoft ASP.NET MVC Framework açık kaynak kodludur. Yani Microsoft geliştirdiği bu frameworkün kaynak kodlarını yazılım geliştiricilere açmıştır. Burada ki stratejik kararları daha detaylı değerlendirmek gerekir. Ancak MVC framework gibi bir ortamda çalışmayı yeğleyecek kitlenin genellikle ALT.NET diye nitelendirilen sadece Microsoft tarafından sağlanmış .NET araç/kütüphane/frameworklerini kullanmayan open source sever camiasının sempatisini kazandığı bir gerçektir.

Webforms'a ne olacak? WebForms kullanmayı bırakıp MVC mi kullanmamız gerekiyor?

ASP.NET WebForms desteklenmeye devam edecektir. Ki zaten şu an piyasada component desteği ve diğer 3.parti bileşenlere bakıldığında WebForms için büyük bir destek mevcut, MVC Framework için bu destek büyüyene kadar bir çok yeni projede halen WebForms tercih edilmeye devam edecek MVC Framework ise alternatif oluşturacak ve projenizin gereksinimlerini ve tercihlerinize göre uygun yapıyı seçebiliyor olacaksınız.

Peki neden MVC Framework ne sunuyor?

  • ASP.NET WebForms ile kullandığınız master page yapısını, kullanıcı kontrollerini,session,membership vb yapıları kullanmaya devam edebiliyorsunuz.
  • ViewState yoktur. MVC Framework mimarisi ViewState mantığına ters düşmektedir.
  • MVC Framework HTML çıktısı üzerinde yazılım geliştiriciye tam kontrol sunmaktadır. Bu webforms sayfasına bir webcomponenti ekledikten sonra o kontrolün HTML çıktısının ne olacağını kontrol edememekten rahatsız olan web developerların çok seveceği bir özelliktir. Ancak webcomponentilerinin getirdiği bazı kolaylılardan şimdilik mahrum kalınması da bir dezavantaj olarak gözükebilmektedir. MVC Framework için helper methodları ve web control kütüphaneleri geliştirilmeye devam etmektedir bunların sayısı ve yetenekleri artıktıkça tüm html çıktısını kendisi yönetmek istemeyen ve web kütüphanelerin sağladığı kolaylıkları kullanmaya devam etmek isteyen yazılım geliştiriciler de MVC Framework'e daha sıkcak bakmaya başlayacaktır.
  • MVC framework test edilebilirlik sunmaktadır. WebForms uygulamaları da test edilebilirdi ancak unit testing ile değil uygulama deploy edildikten sonra kaydedilen scriptleri tekrar run ederek ve http requestlerini kaydedip tekrar etme mantığı ile çalışan test yöntemleri ile test edilebiliyordu. MVC Framework yapısı itibariyle controller sınıflarında yazılan her sayfa aksiyonun test edilebilir olmasını sağlamaktadır.
  • MVC Framework tasarımı itibariyle pluggable bir yapıdadır, dependency injection framework kütüphaneleri ile birlikte çalışılabilmektedir.
  • URL routing sistemi üzerine kurulu olan MVC Framework ile arama motorları ile uyumlu bir yapıdadır. URL routing ile tanımlanan adresler yapısına bir örnek vermek gerekir ise /kullanici/goster/1 şeklinde bir adres tanımlanabilir. Bu şekilde tanımlanan bir adrese istek yapıldığında kullanicicontroller sınıfında ki goster method çağrılır parametre olarak 1 değeri geçilir. kullanicicontroller sınıfında ki duzenle methodunu çağırmak için kullanici/duzenle/1 adresi kullanılmaktadır. Bu örneklerden anlaşıldığı gibi gelen bir http isteği webforms mimarsinden farklı olarak html markup içeren .aspx dosyasına değil doğrudan c# sınıfı olan controller sınıflarına gider, controller sınıfı ise bir aspx sayfası mı oluşturağına ya da bir nesneyi xml, json gibi mi döneceğine karar vererek view katmanını aktive eder.

Model - View - Controller kavramları


*msdn.microsoft.com


Model katmanı veriyi ve bu veriyi işlemek iş mantığı çalıştıran katmandır. Daha pratik olarak örneklendirmek gerekir ise sisteminizde ki kullanıcı entitynizi temsil eden sınıfdır, kullanıcı bilgilerine erişmek, kullanıcı kaydetmek, kullanıcıyı kaydederken işlettiğiniz iş kuralı/mantığının yer aldığı sınıflardır.

Controller katmanı http requestleri ile gelen isteklerin eşleştirildiği action methodlarının yer aldığı katmandır. Gelen bir http isteği routing tablosuna bağlı olarak doğrudan controller sınıflarına ve o sınıflarda ki action methodlarına aktarılır. Controller sınıfı içinde yer alan action method içerisinde Model katmanı da kullanılarak yapılması gereken işler (bir veriye erişmek,güncellemek vs. gibi) yapılır ve view'ın nasıl döneceğine göre bir geri dönüş türü ile view katmanı aktive edilir.

View katmanı kullanıcı arayüzünün oluşturulduğu katmandır. Model her zaman bir .aspx dosyası olmak zorunda değildir tanımlanmış başka bir viewengine ile view katmanı oluşturulabilir. ASP.NET MVC Framework ile gelen .aspx dosyaları ile çalışan standart view engin yanında internet üzerinden genellikle open source olan bazı view engine kütüphanelerine erişebilirsiniz. Bu viewengine değiştirilebilme durumu da MVC Framework'ün pluggable olan tasarımı sayesinde olmaktadır. Örnek bir kaç viewengine kütüphanesinden bahsetmek gerekir ise; Nahml (link1, link2), Spark(link1, link2), Brail (link1, link2), String Template (link1,link2).


Bundan sonra ne olacak? WebForms mu? MVC Framework mü? Hangisini seçmeliyim?

ASP.NET MVC Framework, WebForms yerine gelmiş bir teknoloji değildir. Projenizin gerekliliklerini de göz önünde bulundurarak hangisini seçeceğinize karar verirsiniz.

MVC Framework seçmenin avantajlar

  • Model, view, controller gibi katmanların ayrılması ile iş mantığı kodlarının yönetilmesi daha kolaylaşmıştır.
  • Web sitenizde yer alan farklı bölümlerin farklı yazılımcılar tarafından geliştirilmesini bir adım daha kolaylaştırmıştır.
  • Test driven development desteği vardır, TDD yapılacak ise mutlaka MVC kullanılmalıdır. Zira controllerlar webforms da olduğu gibi view etkileşimi (btnSave.Click gibi) ile çalışmamaktadır.
  • ViewState ve sunucu taraflı web componenetleri çalışmadığı için istemciye giden HTML markup çıktısı üzerinde tam kontrolünüz vardır.
  • Bir internet sitesi geliştiriyorsanız REST (Representational State Transfer) url yapısı ile çalıştığı için arama motorlarının indexlemesi ve tekrar bulabilmesi için avantaj sağlar. show.aspx?id=1 gibi bir adres yerine makale/asp.net/aspnet_ile_mvc_uygulamalari gibi bir adres arama motorları tarafından içeriğine göre daha tercih edilirdir. Bu sayede arama sonuçlarında yukarılarda çıkabilirsiniz.
  • İstemciye giden html çıktısı daha küçüktür çünkü hidden inputlar içinde, viewstate gibi veriler istemciye aktarılmaz ve tabiki geriye de post edilmez. Herkese açık ve yoğun kullanıcı trafiği olan sitelerde ölçülebilir bir performans kazandıracaktır.
  • jQuery vb. javascript kütüphaneleri ile daha kolay çalışabilirsiniz. Zira Html çıktısında oluşturulan elementlerin id değerleri tamamen sizin kontrolünüzdedir. WebForms'da her web componentinin istemci tarafında ki id si ClientID sunucu taraflı propertysi ile alınıp javascript kodlarının arasına basılması gerekiyordu.

WebForms seçmenin avantajları

  • Bir windows uygulamasında olduğu gibi olay tabanlı programlama desteği sunmaktadır. (button.click gibi)
  • İlk günlerinden itibaren gelişmiş ve büyümüş (gerek Microsoft tarafından sağlanan, gerek üçüncü parti -telerik,devexpress- vb) bir web component desteği mevcuttur. Çok güçlü yeteneklere sahip datagrid gibi listeme kontrollerine sahiptir. Bugüne kadar ASP.NET ile geliştirme yapmış yazılım geliştiriciler ise benzeri web componentlarını kullanmaya aşinadır.
  • RAD ortamlarından uygulama geliştirmiş tüm yazılım geliştiricinin aşina olduğu bir yapıda çalışmaktadır. Örneğin hiç web development yapmamış bir yazılım geliştiricinin adapte olması daha kolaydır.
  • Sayfa bazında durum yönetimi kolaydır, viewstate kullanır.

Uygulama geliştirirken unit test yapacağım, kullanıcıya giden çıktının kontrolüne sahip olmalıyım diyorsanız MVC Framework seçebilirsiniz.
Daha hızlı biçimde RAD toolları kullanarak, veri yoğunluklu ve windows forms da ki olay tabanlı yaklaşım ile uygulama geliştireceğim diyorsanız WebForms seçebilirsiniz.


Bu makalemizde MVC Framework'ü temel olarak anlamaya ve kafamızda pozisyonlandırılmasına çalıştık. Çıkış amacını anlamaya ve WebForms ile karşılaştırarak her birinin avantajlarını görmeye çalıştık.

ASP.NET MVC Framework ile ilgili makalelerim devam edecek.

Specified Pickup Directory özelliği ile geliştirme ortamınızda smtp sunucusu kullanmanıza gerek yok.

Geliştirme ortamınızda programınız içinden email gönderilmesi durumunda geçici bir email server kurabilir ya da production da olan bir smtp sunucusu üzerinden çalışma yapabilirsiniz.
Ben daha önce genellikle kendi makineme ya da geliştirme ortamına local bir smtp sunucusu kurardım. Bunun yerine system.net için web.config dosyanızda aşağıda ki tanımlamayı yaparsanız.
Program içinden system.net ile email göndermek istediğinizde emailer C:\gidenposta klasörüne .eml uzantılı dosyalar olarak yazılır .eml dosyası çift tıkladığınız da email istemci yazılımınız tarafından açılacaktır.


<configuration>
    <system.net>
        <mailSettings>
            <smtp deliveryMethod="SpecifiedPickupDirectory">
                <specifiedPickupDirectory pickupDirectoryLocation="c:\gidenposta" />
            </smtp>
        </mailSettings>
    </system.net>
</configuration>

PHP versus ASP.NET – Windows versus Linux – Who’s the fastest ?

 

Microsoft Developer Tools and Platform Group'da Senior Program Manager olarak çalışan Joe Stagner ASP.NET ve PHP'nin Windows ve Linux üzerinde performance testlerini gerçekleştirmiş.

Test ve sonuçları için tıklayınız.

Test sonrası ek yorumlar için tıklayınız.

 

Telerik Extensions for ASP.NET MVC

Telerik, ASP.NET MVC için jQuery destekli açık kaynak kodlu bir kütüphane sağlamaya başladı. Codeplex'den open source olarak indirebileceğiniz projenin özelliklerinde bir önceki makalemde yazdığım Fluent Interface'de kullanılıyor. Makale ilginizi çektiyse bu projeyi bu gözle de inceleyebilirsiniz.

http://telerikaspnetmvc.codeplex.com

 

Fluent Interface



Fluent Interface kavramı 20 Aralık 2005 tarihli Fluent Interface (akıcı arayüz) başlıklı makalesinde anlattığı gibi Martin Fowler ve Eric Evans tarafından bulunmuştur.

Temel olarak birbiri arkasına aynı satırda çağrılan methodlar ile okunurken yaptığı işi anlatan methodlar hazırlanmasıdır. Bunu yapmak için bir methoddan geriye aynı nesneyi dönmek yeterlidir.
Method çağrılarının "akıcı" şekilde okunması ile yapılan işin kendi kendini anlatır şekilde, dokumente edilmiş, yorum satırı ile desteklenmiş gibi açıklayıcı

Örneğin Field bazında sorgulama yapmak için kullanılacak bir sınıf tanımlayalım ve bunun Fluent Interface

 public class FieldCriteria
    {
        public string FieldName { get; private set; }
        public FieldCriteria(string fieldName)
        {
            this.FieldName = fieldName;
        }

        public FieldCriteria StartsWith(string startsWith)
        {
            return this;
        }
        public FieldCriteria EndsWith(string endsWith)
        {
            return this;
        }
        public FieldCriteria Contains(string contains)
        {
            return this;
        }
        public FieldCriteria LengthOf(int length)
        {
            return this;
        }
    }

Yukarıdaki sınıfta StartsWith, EndsWith,Contains,LengthOf methodlarının içeride kendi işlerini yaptığını ve geriye yine aynı nesneyi (yani this) döndüğünü görüyorsunuz. Bu şekilde akıcı bir method çağrısı oluşturulmuş olur.

FieldCriteria sınıfından bir instance aldığımızda onu aşağıdaki şekilde kullanabiliriz;

     FieldCriteria c = new FieldCriteria("Name").LengthOf(5).StartsWith("C").EndsWith("Z").Contains("N");

veya bana göre daha okunuşlu şekilde

      FieldCriteria c = new FieldCriteria("Name")
          .LengthOf(5)
          .StartsWith("C")
          .EndsWith("Z")
          .Contains("N");

Method çağrı zincirini (ingilizce kanykalarda method chaining olarak bulabilirsiniz) ingilizce olarak okumaya çalıştınızda uzunluğu 5 olan C ile başlayan Z ile biten ve N içeren bir Name alanı kriteri oluşturduğumuz gayet açık gözüküyor sanırım.


Konu ile ilgili araştırma yaparken Ruby'de olan bir özellik ile ilgili kaynaklara ulaştım. Aşağıdaki gibi bir çağrı ile 10dk. önces/sonrası için DateTime nesnesine erişebiliyorsunuz. Bunu C# ile uygulamak için Extension Method kullanmamız gerekmektedir.

10.minutes().ago()
10.minutes().later()

gibi bir erişim için öncelikle int veri türünü bir method eklememiz gerekiyor.

  public static class DateTimeExtensionMethods
  {
    public static TimeSpan minutes(this int mins)
    {
      return new TimeSpan(0, mins, 0);
    }
    public static DateTime ago(this TimeSpan ts)
    {
      return DateTime.Now.Add(-ts);
    }

    public static DateTime later(this TimeSpan ts)
    {
      return DateTime.Now.Add(ts);
    }
  }


Yukarıdaki kod int veri türüne minutes şeklinde bir method ekler ve bu method geriye TimeSpan döner.
TimeSpan nesnesine ise ago ve later adında iki method ekler.

Bu methodlarda geriye DateTime.Now değerini baz alarak genişletilmiş TimeSpan sınıfın o anki örneğinin değerini ekleyerek/çıkararak yeni bir DateTime nesnesi döner.

      Console.WriteLine(10.minutes().ago().ToString());
      Console.WriteLine(10.minutes().later().ToString());
      Console.ReadLine();

Yukarıda ki kod bloğu çalıştırıldığında çıktısı aşağıda ki gibi olacaktır.

12.08.2009 17:20:25
12.08.2009 17:40:25


Fluent Interface yöntemi yazılım geliştirirken sizlere bir bakış açısı katacaktır ancak Fluent Interface yöntemi diğer tüm kalıplar gibi her projede kullanılmaz. Genel olarak yeniden kullanılabilir kütüphanelerde yapılandırma amacıyla (NHibernate konfigurasyonu bu şekilde yapılabiliyor) ya da ilk örnekte verdiğim kriter örneği gibi durumlarda kullanılabilir. Fluent Interface olmadan olmaz değil tabi ki ancak uygun yerlerde kullanıldığında kod kalitesini ve okunabilirliğini artıracağınız bir gerçektir.

Partial Methods


C# 3.0 ile beraber gelen partial class yapısını artık ister istemez bir çoğumuz kullanıyoruz. Visual Studio Designer'ları aracılığı ile oluşturulan sınıflar genellikle partial class olarak oluşturulur.

Partial class ların ne olduğunu kısaca hatırlamak gerekirse; fiziksel olarak yada aynı fiziksel dosyada (amacına göre ayrı iki .cs dosyasında olması makbul ve mantıklıdır) tanımlanan class tanımlarının tek bir class olarak çalışması ve derlenmesidir. Yani aslında bir sınıfın methodların farklı .cs dosyalarında tanımalayabilmeyi sağlar.

Kısaca

ApprovalDocument.cs içinde aşağıdaki property ve methodların olduğunu varsayalım.

 public partial class ApprovalDocument
    {
        public string DocumentName { get; set; }
        public bool Delete()
        {
            //delete işleri...
            return true;
        }
        public bool Save()
        {
            //persistency için gerekli işler buraya...
            return true;
        }
    }

ApprovalDocument.2.cs gibi bir yeni dosya oluşturup içine aşağıdaki kod bloğunu ekleyelim.
 
public partial class ApprovalDocument
    {
        public bool GetBackDeletedApproval()
        {
            //silinen bir onay dokümanını geri almak için gerekli kodlar....
            return true;
        }
    }

ApprovalDocument sınıfı tek bir sınıftır ancak iki farklı dosyada yer almaktadır. Aşağıdaki gibi kullanılabilir.

            ApprovalDocument aDoc = new ApprovalDocument();
            aDoc.DocumentName = "Test";
            aDoc.Delete();
            aDoc.GetBackDeletedApproval(); //2.dosyada yazdığımız method



Partial Methods

Partial sınıfları hatırladıktan sonra karşılaşılan bir zorluktan ve bunun çözümünden, yani partial methods lardan bahsedelim.

Yukarıkdaki örnekte olduğu gibi partial class lar genellikle kullanıcı tarafından oluşturulmazlar aslında, en çok kullanımının görüldüğü yer Visual Studio Designerları, code generator araçları (CodeSmith, NVelocity gibi.) ya da başka bir araç tarafından otomatik oluşturulan sınıflara ekleme yapmak için kullanılır.

Örneğin Visual Studio Designer'ları otomatik oluşturdukları sınıfı partial yaparlar ve kullanıcı için otomatikolusansinifadi.user.cs gibi (zorunlu değil ama kabul görmüş bir isimlendirme) dosya oluşturup içerisine aynı namespace altında ve aynı isme sahip bir partial class eklenerek otomatik oluşturulan sınıfa eklemeler yapılabilir. İş hayatımda kendi hazırladığımız kod üreten Visual Studio Designerları yazmamız gerekti ve otomatik oluşturulan bir dosyanın yanına .user.cs eki ile biten bir dosya daha oluşturtuyoruz. user.cs dosyası zaten ilk kayıtta oluşturulduysa ikinci defa üzerine yazmıyoruz. Visual Studio ile builtin gelen designerlarda aynı şekilde çalışmaktadır ve her zaman otomatik oluşturulan kodun yer aldığı dosyanın en üstünde bu dosya autogenerated'dır içeriğini değiştirmeyiniz şeklinde uyarmaktadır. Zira tekrar designer kayıt yaptığında bildiği kodu oluşturmaktadır. Biz ise otomatik oluşturulan kod dışında user.cs gibi dosyalara kodumuzu yazarak otomatik oluşturulan partial class'a eklentimizi yaparız.

Burada şöyle bir senarya oluşturulım ve sorunu tanımlayalım.

Aşağıdaki ApprovalDocument.cs nin bir şekilde otomatik oluşturulduğunu düşünelim.

public partial class ApprovalDocument
    {
        public string DocumentName { get; set; }
        public bool Delete()
        {
            //delete işleri...
            return true;
        }
        public bool Save()
        {
            //persistency için gerekli işler buraya...
            return true;
        }
    }

Bu partial sınıfa bir ekleme yapmak için ApprovalDocument.user.cs oluşturalım. Ancak istenen şey otomatik oluşturulan Save methodu çalışmadan önce bazı custom validation işlerimini yapması ve ona göre işine devam etmesi olsun. Bu durumda CustomValidation methodu user.cs dosyası içerisine yazılmalıdır. Ancak Save işleminden hemen önce otomatik çalışması nasıl sağlanacak? Otomatik oluşan kodumuzu aşağıdaki oluşturulacak şekle getirelim;

    public partial class ApprovalDocument
    {
        public string DocumentName { get; set; }

        private bool _isValid = false;
        partial void CustomValidation();


        public bool Delete()
        {
            //delete işleri...
            return true;
        }
        public bool Save()
        {
            CustomValidation();
            if (_isValid)
            {
                //persistency için gerekli işler buraya...
            }

            return true;
        }
    }

Yukarıdaki otomatik oluşturulan kodda yapmamız gereken değişiklikleri kalın olarak belirttim.

partial void CustomValidation(); olarak tanımlanan satır ile bir method tanımlanıyor ancak implementasyonu yok, partial method olarak tanımlanması sayesinde otomatik oluşturulan kod içinde Save method içerisinde CustomValidation metodu çağrılır. Ve biz CustomValidation partial methodunu partial class oluşturarak eklemezisek bu method çağrısı hiç bir şey yapmayacak ve hata da vermeyecektir. _isValid değeri her zaman false kalacaktır.

ApprovalDocument.user.cs içerisini aşağıdaki gibi düzenlemeyelim.

    public partial class ApprovalDocument
    {
        public bool GetBackDeletedApproval()
        {
            //silinen bir onay dokümanını geri almak için gerekli kodlar....
            return true;
        }
        partial void CustomValidation()
        {
            this._isValid = true;
        }

    }

Bu şekilde otomatik oluşturulan kodun akışı içerisine kendi kodumuzu dahil etmiş oluyoruz. Sadece method ekleyerek bunu yapamayız ancak otomatik oluşturulan kodunuz size bu olanağı sunuyor ise akışın içerisine dahil olabilirsiniz.

Partial methodlar yokken bunu nasıl yapabilirdik? Event'ler ile bu yapılabilirdi ancak bu şekilde daha şık ve doğru bir yapı olduğunu düşünüyorum.

Partial methodlar ile kendi yazdığınız kodlar dışında nerede karşılaşabilir ve kullanabilirsiniz? Örneğin LINQ to SQL Designer'ı ürettiği kodda partial methodlar tanımlamaktadır ve bunların implementasyonunu ekleyerek custom validation gibi işlemler yapabilirsiniz. LINQ to SQL Designer'ının partial method örneği için tıklayınız.


syncfusion

Syncfusion asp.net mvc component kütüphanesini bir günlüğüne 5$'a satıyor. Normal'de değeri 995$ olan bu kütüphaneyi eğer ASP.NET MVC ile ilgiliyseniz kaçırmayın derim.

http://www.syncfusion.com

 

Web Statistics