Çarşamba, Ağustos 26, 2009

ASP.NET AJAX’A GENEL BAKIŞ:

Asp.net ajax çok duyduğum ama bir türlü çalışmaya zaman bulamadığım bir konu olmuştu. Sebebi ise benim mükemmeliyetçi anlayışımdan kaynaklanıyor biraz. Bir konuya çalışmam için o konu hakkındaki kitapların ,makalelerin, frameworkler bulunmuş ve eğer gerekliyse IDEler in indirilmiş olması gerekir  Ama bu kez yeni başladığım asp.net kitabında (sadece 1800 sayfacık J) Ajax konusunun 250 sayfada anlatılması , konuyu küçümsememe yol açtı ve başladım okumaya. (20 yıllık hackerlar işi gücü bıraktılar Ajax yazıyorlar sözü konuyu fazla önemsememe sebep oldu herhalde) Şimdi kısa yoldan sitenizi nasıl AJAX kullanan bir site haline getirebilirsiniz ve gerçekten de profesyonel şeyler ortaya çıkarırsınız konusunda öğrendiklerimi paylaşacağım.

AJAX nedir?


Normalde asp.net sayfalarımızda sayfa ilk yüklendiğinde sayfamız tamamen serverdan isteniyor ve server bize sayfaları  hmtl,javascript karışımı bir şekilde gönderiyordu. Sitemize bir server kontrolü yerleştirdiğimizde ve bu server kontrolünün servera istekte bulunmasıyla sayfamızda bazı veriler servera gönderiliyor ve verilere göre sayfamız  kullanıcının tarayıcısında yorumlanacak şekilde tekrar gönderiliyordu. Bu işleme Post-Back deniyordu. Post-Back işleminde bir butonun ya da herhangi server kontrolünün post back işlemini tetiklemesi sayfamızın tamamen yenilenmesine yol açıyordu. Özellikle form sayfalarında her kontrolün yeni verilere ihtiyaç duymasıyla sayfa post-back işlemlerinden dolayı yenileme işlemini çok sık yapıyor ve bu da can sıkıcı bir durum olarak görünüyordu. AJAX ile bu durum değişti çünkü klasik request-response yapısı yine çalışıyordu fakat dili oluşturanlar serverlardaki frameworklere ve tarayıcılara Asenkron cevaplama(Asynchronous Response) veAsenkron İstek yapma( Asynchronous Request) kabiliyetini eklediler. Böylece konuyu açacak olursak , sayfada kısmi istekler oluşabiliyor aynı zamanda  alınan kısmi cevaplarla sayfamızın bir bölümü güncellenmiş oluyor.  Burada AJAX arkaplanda iki teknolojiyi kullanıyor. Birincisi XMLHttpRequest nesnesi.Bu nesne tarayıcının server ile haberleşmesini sağlıyor. Bu nesne aslında IE5 sürümünden beri kullanılıyordu. (MSXML  ActiveX Component). Tabiki asıl bileşen ve ikinci teknolojimiz JavaScript. Bu nesne de haberleşme esnasında mesajların paketlenmesini sağlıyor. Diğer yararlanılan teknolojiler ise  DTHML, DOM ve JSON.  AJAX dilden bağımsız bir teknoloji. Yani AJAXı  JSP, PHP ya da ASP.NET ile kullanabiliyoruz. (20 yıllık hackerlar AJAXı  Google tarafında  geliştiriyorlar tabiki J ) Ama dillerin kendilerine göre Frameworkleri var AJAX üzerine. ASP.net 3.5 ile de Visual Studio IDE yi kullanacak olursak ASP.net sitelerimizin geliştirme sürecinde TOOLBOX içerisinde Ajax Extensions  hazır halde geliyor. Tabiki serverda .net framework  3.5 bulunuyorsa sitemiz AJAX için hazır demektir.  Ayrıca MS tarafından geliştirilen kodlarını görebildiğiniz ama gelişimine katkıda bulunamadığınız bir AJAX Toolkit, CodePlex üzerinden ücretsiz indirilebiliyor. Şimdi hikaye kısmını başarıyla tamamladıktan sonra Microsoft’un bizim için hazırlamış olduğu server kısmı için kontrolleri biraz inceleyelim.

AJAX Server Kontrolleri


ScriptManager: Her asp.net ajax özelliği aktif sayfada bulunması gereken bir kontrol.  Script Manager client bilgisayarına göderilecek olan javascriptleri göndermekle görevlidir.  Her sayfada n fazla bir adet ScriptManager olabilir.

ScriptManagerProxy: AltSayfada yada iç sayfada SciriptManagerin yaptığı işi yapar. Eğer master page içinde ScriptManager tanımlanmışsa master page üzerinden türetilmiş sayfalarda  ScriptManagerProxy tanımlanmalıdır.

Timer: Timer kontrolü belirli zaman aralıklarında client-tabanlı olayları gerçekleştirmek için kullanılır. Update ya da refresh gibi işlemler örnektir. UpdatePanel içinde kullanılır ve OnTick ile her tick için yapılması gereken event tanımlanabilir. Interval özelliği için 1000 = 1 sn demektir.

UpdatePanel: Bu kontrol asp.net ajax için bir kontejnır pozisyonundadır. Kısmi postback işlemlerinde sayfanın tamamını postback etmeden güncelleme işlemini ScriptManager ile haberleşerek yürütür.

UpdateProgress: Bu kontrol  ajax kısmi postback işlemleri yaparken son kullanıcıya görsel bir öğe gösterilmesine izin verir. Uzun süren işlemlerde kullanmak mantıklıdır. Bir yazı hareketli bir resim ya da daha farklı etkinlikler düzenlenebilir. Hayal gücünüze bırakılmıştır. İçerisinde tüm asp.net kontrollerini de kullanabiliyoruz.

Burada en basit olarak yapılabilecek bir ajax saat uygulamasının kodlarına yer veriyorum.

<div>


<asp:ScriptManager ID="ScriptManager1" runat="server">


</asp:ScriptManager>


<asp:UpdatePanel ID="UpdatePanel1" runat="server">


<ContentTemplate>


<asp:Label ID="saat" runat="server" ></asp:Label>


<asp:Timer ID="Timer1" runat="server" Interval="1000" OnTick="timerTicked">


</asp:Timer>


</ContentTemplate>


</asp:UpdatePanel>



<script runat="server" >


protected void page_Load( object sender, EventArgs e )


{


saat.Text = System.DateTime.Now.ToString();


}


protected void timerTicked( object sender, EventArgs e )


{


saat.Text = System.DateTime.Now.ToString();


}


</script>


</div>




Burada kod ve .aspx sayfalarını ayırmak yerine aspx sayfasında  script tagları arasına yazdım kodları. Bu aspx.cs dosyasında yazmakla aynı amaca hizmet ediyor. (NET2003 için varsayılan kodlama bu şekildeydi.) Benim bu yöntemi seçme sebebim ise makalede kodları bütün halinde gösterebilmek.

Burada dikkat edersek ScRiptManager kontrolüne sadece sayfamızda yer verdik.Ajax kullanacağımız kontrolleri updatepanel içerisindeki ContentTemplate içerisine yazdık. AJAX Timer ‘ın Interval özelliği sayesinde son kullanıcının bilgisayarında her saniyede bir serverdan saati sormasını tetikledik.

Örnek:2 Burada da butonla tetikleyerek saati istedik ama sayfada tamamıyle bir postback gerçekleşmediğine dikkat edin.

<div>


<!-- Script Manager her ajax sayfasında bulunmak zorunda. -->


<asp:ScriptManager ID="ScriptManager1" runat="server">



</asp:ScriptManager>


<!-- update panel konteynırımız -->


<asp:UpdatePanel ID="UpdatePanel1" runat="server">


<ContentTemplate>


<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>


<br />


<br />


<asp:Button ID="Button1" runat="server" Text="Saati Ajax ile getir" onclick="ajaxla" />


</ContentTemplate>



</asp:UpdatePanel>


</div>


<script runat="server">


protected void ajaxla( object sender, EventArgs e )


{


Label1.Text = System.DateTime.Now.ToString();




}


</script>




Burada UpdatePanel   içerisinde buton kontrolüne de yer verdik. UpdatePanel içerisinde Triggers kısmında dışarıda tanımladığımış olduğumuz butonları da ajax update panelimiz için tetikleyici olarak kullanabiliryoruz. Aşağıdaki örnekte bu şekilde bir kullanım söz konusu:

Bu örnekte senaryoyu biraz daha genişlettim ve veritabanından verileri ajax Update panel içerisinde çekmek istedim.   UpdateProgress kontrolünün de nasıl kullanılacağına güzel bir örnek oluşturuyor.  Butona basıldığında 10 saniye kadar bekleme olacaktır bu da gerçek hayatta karşılaşabileceğimiz bir senaryo. Verilerin serverdan yüklenmesi uzun sürüyor olabilir ayrıca sorgunun  da çok komplez bir sorgu olduğunu varsayabiliriz. Bunu görebilmek için ben ipliği 10 saniye kadar beklettim.

<div>


<asp:scriptmanager ID="Scriptmanager1" runat="server"></asp:scriptmanager>



<asp:UpdateProgress ID="UpdateProgress1" runat="server">


<ProgressTemplate>


Güncelleme yapılıyor...


<asp:Image runat="server" ID="updatePic" ImageUrl="resim.jpg" />


</ProgressTemplate>


</asp:UpdateProgress>


<asp:UpdatePanel ID="UpdatePanel1" runat="server">


<ContentTemplate>





<asp:GridView ID="GridView1" runat="server">


</asp:GridView>




</ContentTemplate>


<Triggers>


<asp:AsyncPostBackTrigger ControlID="Button1" EventName="click" />



</Triggers>


</asp:UpdatePanel>


<asp:Button ID="Button1" runat="server" OnClick="getir" Text="Button" />


<script runat="server">



protected void getir( object sender, EventArgs e )


{


System.Threading.Thread.Sleep( 10000 );


System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(@"Data Source=ATCI-LAPTOP\SQLEXPRESS;Initial Catalog=siteDB;Integrated Security=True");


System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();


cmd.Connection = con;


cmd.CommandType = System.Data.CommandType.Text;


cmd.CommandText = "Select otomobil.ID, otomobil.MarkaAdi, otomobil.PlakaNo from otomobil ";


System.Data.SqlClient.SqlDataAdapter adp = new System.Data.SqlClient.SqlDataAdapter( cmd );


System.Data.DataSet ds = new System.Data.DataSet();


con.Open();


adp.Fill( ds );


GridView1.DataSource = ds;


GridView1.DataBind();



}


</script>


</div>




Çoklu UpdatePanel Kullanımı


Diğer bir konu ise çoklu UpdatePanel kullanımı. AJAX tekniğini sayfalarımızda kullanmamızın sebeplerinden en önemlisi sayfada kısmi postback işlemlerine izin vemesiydi. Birden fazla UpdatePanel kullanımında dikkat edilmesi gereken noktalardan en önemlisi yine ScriptManage nesnesinin tekrar yazılmaması gerektiği. Bir sayfada bir tane ScriptManager olmalı. Diğer bir konuda  butonların tetiklenmesi sırasında birkaç noktaya dikkat etmek gerekli.

<asp:UpdatePanel UpdateMode="Conditional" ID="UpdatePanel2" runat="server">

Burada gördüğümüz gibi aslında UpdatePanel in UpdateMode adında bir özelliği daha var. Bu özellik biraz tetiklenme şekli hakkında bilgi veriyor.  Eğer herhangi bir butonun yada tetikleyicinin UpdatePaneli Triggers bölümünde yer almadan tetikleyebilmesini istiyorsak UpdateMode=”Always” modunda olmalı. Varsayılan olarak da Always modunda geliyor.

Aşağıdaki örneğe bakalım.

<div>


<asp:ScriptManager ID="ScriptManager1" runat="server">


</asp:ScriptManager>


<asp:UpdatePanel UpdateMode="Always" ID="UpdatePanel1" runat="server">


<ContentTemplate>


<asp:Label ID="Label1" runat="server"></asp:Label>


</ContentTemplate>


<Triggers>


<asp:AsyncPostBackTrigger ControlID="Button1"


EventName="Click" />


</Triggers>


</asp:UpdatePanel>


<!-- update panel varsyılan olarak Update Mod olarak always dir


Eğer sadece kendi triggerleri ile tetiklenmesini istersek updateMod=Conditional olarak değiştirmeliyiz.


-->


<asp:UpdatePanel UpdateMode="Conditional" ID="UpdatePanel2" runat="server">


<ContentTemplate>


<asp:Label ID="Label2" runat="server"></asp:Label>


</ContentTemplate>


</asp:UpdatePanel>


<br />


<br />


<asp:Button ID="Button1" runat="server"


Text="Click  to  initiate  async  request"


OnClick="Button1_Click" />


<script runat="server">


protected void Button1_Click(object senderEventArgs e)


{


Label1.Text = "Tetiklenme zamanı:  " + DateTime.Now;


Label2.Text = "Tetiklenme zamanı:  " + DateTime.Now;


}


</script>


</div>




Bu örnekte eğer UpdatePanel kontrollerinin her ikisi de UpdateMode=”Always” olarak ayarlanmış olsaydı  Butona tıklandığında her iki label kontrolünde de zaman güncellenecekti. Fakat şu anki kodlarda UpdatePanel2 sadece kendi Triggers bölgesinde tanımlanmış olan tetikleyicilerle tetiklenecektir. Ki şu an bir tetikleyici tanımlanmadığı için örnekte hiçbir zaman tetiklenemeyecektir.

Sonuç


AJAX konusunda hızlı bir başlangıç yapmış olduk. Bu kısımım başarıyla anlaşılması web sayfalarımızda AJAX kullanmak için bir başlangıç olabilir.   Makaledeki örnekleri uygularken tarayıcıda gördüğümüz sayfaların kaynak kodlarına  da bakılması html ve JavaScript tarafında da neler döndüğünü görmek açısından yararlı olabilir. Çünkü ASP.NET bize arka tarafta birçok kolaylık sağlıyor ve JavaScript kısmını tamamen kendisi hallediyor diyebiliriz. Bir başka makalede görüşmek üzere.

makalenin pdf versiyonu

Salı, Ağustos 04, 2009

VİSUAL STUDİO İÇİNDEKİ GİZLİ HAZİNE-1

Visual Studio geliştirme ortamı gerçekten çok başarılı ve zevkle kullandığımız bir yazılım geliştirme aracı. Windows Form uygulamaları, konsol uygulamaları, Web uygulamaları ve daha birçok proje türü destekleniyor. Akıllı kod tamamlama ve projeyi yönetme kabiliyetleriyle gerçekten çok ilgi çekici bir ortam sağlıyor. Peki biz bu ortamıne kadar verimli kullanıyoruz. Visual Studio ile tanışmamın 4. senesinde çeşitli sürümlerini kullandım ama daha tam olarak her özelliğini kullanmış ve keşfetmiş değilim. Her yeni özellik keşfetmemde seviniyorum aynı zamanda da hayrete düşüyorum. Bir yazılım geliştiriciye bu kadar mı güzel ortam sunulabilir diye. Zaten .net ortamı IDE sayesinde çok tutuldu. Java Visual Studio'nun sağladığı ortamı sağlayabilseydi .net 'in bu kadar yaygın olacağını söyleyemezdik. Lafı uzatmadan hazineden kendimize de biraz pay alalım, eski bir tabirle biz de gagamızı biraz ıslatalım bakalım :)

1-) Sekmeler arasında hızlı geçiş. Alt+Tab kombinasyonuyla windows pencereleri arasında nasıl geçiş yapıyorsak CTRL+TAB kombinasyonu ile de hızlıca Visual Studio içinde o anki sekmeler arasında geçiş yapabiliyoruz. Özellikle kodlama yaparken mouse kullanmadan işlem yapmak için ideal.





2-) Yine bu özellikte de sekmeleri sürükleyip bırakarak ya da sekmeye sağ tıklayıp horizontal ya da vertical yerleşim seçeneklerini seçerek aynı anda iki sekmeyi görebiliyoruz. Bu özellik kod tarafında ve tasarım kısmında hızlı değişiklik yapmamız gerektiğinde kullanışlı bir özellik olabilir.






3-) Aynı dökümanın farklı bölümlerini görüntülemek işlemi de bazen uzun kod sayfalarında belirli kısımlar göz önünde bulundurmak için aynı sayfada aşağı yukarı hareket etmek yerine bulunduğumuz sayfa aktifken Windows-> Split özelliğini açarsak aynı sayfanın iki ekranda farklı kısımlarını görüntüleyecektir.




4-)Eğer uzun süre bir kod sayfası üzerinde çalışmamız gerekiyorsa kod sayfasının geniş ve açık olması bizim için yararlı olacaktır. View->Full Screen ya da SHIFT + ALT + ENTER tuş kombinasyonuyla kodlarımızı tam ekran görebiliriz.

5-)Kod sayfasında uzun satırları görüntülemek için çok fazla kaydırma işlemi gerekir. Uzun satırları alt satırda görüntülemek için Edit->Advanced->Word Wrap ya da CTRL+E tuşlarını kullanabiliriz.




6-)Ufak kod parçalarını yönetmek için de çok beğendiğim bir özellik varmış. Kopyaladığımız kodları toolbox a sağ tıklayarak yapıştırıp bu kodları projenin değişik kısımlarında tekrar kullanabiliyoruz.



7-) Yapılacaklar listesini (To-Do list) yönetmek. Kodlara yazdığımız yorumlar içinden özel kelimelerle başlayanları IDE ototmatik olarak yapılacaklar listesine ekleyebiliyor. Her yorum eklenmiyor. Sadece //TODO: , //UNDONE: , //HACK: ile başlayan yorumlar ekleniyor. İstersek buraya yeni kelimeler ekleyerek görev listesinde görmemizi sağlayabiliriz. Tools->Options->Environment->TaskList altındaki kelimeler listesini uzatıp kısaltmak size kalmış. Görev listesini görebilmek için View->Task List yolunu izlemeliyiz.
Örnek olarak //TODO: add some code here
yazarsak bu task list altında görünecektir.



Bir başka yöntem ise eğer yorum satırı yazmak istemiyorsak ama aynı zamanda kod sayfasında bir satıra görevi bağlamak istiyorsak ilgili kodun bulunduğu satıra imleci bırakarak Edit->Bookmarks->Add Task List ShortCut ya da kısayoldan CTRL+E, CTRL+T kombinasyonlarıyla görevi ekleyebiliriz. Ekleme işleminden sonra görevi yeniden isimlendirmek mantıklı olacaktır.
Bu yazıda bazı çok kullandığım ve yeni öğrendiğim kısayollara yer vermeye çalıştım. Bu konu ile ilgili bir yazı daha yazmayı düşünüyorum. Bu kısayollar Visual Studionun sadece küçük bir kısmı.

Pazartesi, Ağustos 03, 2009

ORM , O/RM, O/R Mapping (Object Relational Mapping)

ORM aslında uzak olmadığımız bir teknik. Ne işe yaradığından kısaca bahsetmek gerekirse, sınıflarımızdan türettiğimiz nesnelerimizin ilişkisel veritabanımız ile daha iyi iletişim kurması anlamına geliyor. Veritabanları hala nesneye yönelik bir tasarımda olmadıkları için programlardaki nesneleri veritabanına tek hamlede değil de parça parça atıyorduk. ORM ile bu işi bir kere yapıp sonrasında veritabanından nesneler sorgulayıp veritabanına nesneler kayıt ediyoruz ve nesneler siliyoruz. ORM sadece tekniğin adı. Java ile haşır neşir olduğumda Hibernate terimini duymuştum. Aynı zamanda .net ile Linq kullanmış ve kolaylıklarını görmüştüm. Bu frameworklerin yaptığı işlem kısaca ORM olarak tanımlanıyor. Linq frameworkte de veriye erişim katmanı çok kolay ve görsel olarak tasarlanabiliyor. Bize kalan lambda ifadelerini öğrenmek ve nesnesel bakış açısına sahip olmak.
ORM üzerine tartışmalar da yok değil. 1 ayda bitecek çalışmayı 1 haftaya indiren teknik acaba performansı etkiler mi sorusu tartışılıyor. Tabiki arada bir çeşit çevirme işlemi olduğu için performans kaybı olacaktır ama bankacalık sistemlerinde bile java hibernate kullanılıyorsa sanırım Türkiye gibi işi bitir de nasıl biterse bitsin bakış açısında işlerin yaygın olduğu bir yerde sanırım ORM kullanmamak kendine haksızlık etmek olacaktır.
ORM ile deneyim ettiğim başka bir konu ise yazdığınız kodun güvenilirliği. Veri erişim katmanı kullanmış olduğunuz için yazdığınız kodun güvenilirliği de artıyor. Linq örneğinde olduğu gibi en küçük projede bile veri erişim katmanı kullanmanız kaliteyi artırıyor.
Aynı şekilde son zamanların yükselenlerinden biri de MVC frameworkler. Artık amaç profesyonelliği en alt seviyede bile gösterebilmek. Orta düzey bir kurum web sitesinde katmanlı bir mimariyi MVC framework sayesinde sağlayabiliyorsunuz. Bu da yaptığınız işin daha kalıcı ve yenilenebilir olmasını sağlıyor.
Son gelişmeleri merakla izliyorum ve bu tür kolaylıkların kullanılması gerektiğine inanıyorum. MS silverlight , linq , MVC framework gibi çalışmalarla hem yazılımcıların çalışmalarının -dolaylı olarak da kendi yazılımlarının- kalitesini artırıyor. Türkiye de sektörden beklenense biraz daha "iş bitsin , sistem çalışsın da nasıl çalışırsa çalışsın" anlayışının tersine kaliteye, mühendisliğe ve alt yapıya da önem veren işlere daha yüksek puan vermesi.