<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SQL Server ASP.NET C# Kitabı &#187; C#, VB.NET, ASP.NET</title>
	<atom:link href="http://www.ahmetkaymaz.com/wp-seo-link-holder_akaymaz.php/category/csharp-vbnet-aspnet-ajax/feed/?404;http://www.ahmetkaymaz.com:80/category/csharp-vbnet-aspnet-ajax/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ahmetkaymaz.com</link>
	<description>SQL Server, C#, VB.NET, ASP.NET, AJAX ile ilgili örnek kitap ve ipuçları</description>
	<lastBuildDate>Tue, 20 Dec 2011 09:25:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JQUERY &#8211; ASP.NET POST işleminde Türkçe Karakter Sorunu</title>
		<link>http://www.ahmetkaymaz.com/2010/02/25/jquery-asp-net-post-isleminde-turkce-karakter-sorunu/</link>
		<comments>http://www.ahmetkaymaz.com/2010/02/25/jquery-asp-net-post-isleminde-turkce-karakter-sorunu/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 14:33:22 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
				<category><![CDATA[C#, VB.NET, ASP.NET]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=349</guid>
		<description><![CDATA[JQuery aracılığıyla bir formu ASP.NET sayfasına doğrudan POST veya GET ile gönderebilmek için Form Serialize işlemi gerçekleştirilir. Bu amaçla .serialize() veya .serializeArray() yordamları kullanılır. 
Özellikle Internet Explorer ortamında bir formu serialize edip ASP.NET sayfasında okumaya çalıştığımızda Türkçe Karakter sorunu yaşanmaktadır. Örneğin &#8220;öçşğüİ&#8221; değeri Ã¶Ã§ÅÄÃ¼Ä şeklinde görünmektedir. Bu karakterlerin UTF-8 olarak gönderilmesi için aşağıdaki örnekte gösterildiği [...]]]></description>
			<content:encoded><![CDATA[<div class="google_plus_one"><g:plusone size="standard" count="true" url="http://www.ahmetkaymaz.com/2010/02/25/jquery-asp-net-post-isleminde-turkce-karakter-sorunu/"></g:plusone></div><p>JQuery aracılığıyla bir formu ASP.NET sayfasına doğrudan POST veya GET ile gönderebilmek için Form Serialize işlemi gerçekleştirilir. Bu amaçla <b>.serialize()</b> veya <b>.serializeArray()</b> yordamları kullanılır. </p>
<p>Özellikle Internet Explorer ortamında bir formu serialize edip ASP.NET sayfasında okumaya çalıştığımızda Türkçe Karakter sorunu yaşanmaktadır. Örneğin &#8220;öçşğüİ&#8221; değeri Ã¶Ã§ÅÄÃ¼Ä şeklinde görünmektedir. Bu karakterlerin UTF-8 olarak gönderilmesi için aşağıdaki örnekte gösterildiği gibi &#8220;application/x-www-form-urlencoded; charset=utf-8&#8243; şeklinde content teype belirmek gerekiyor.</p>
<pre name="code" class="javascript">
var formValue=$("#aspnetForm").serializeNoViewState();

$.ajax({
	type: "POST",
	url: "OrnekSayfa.aspx?Prm=1",
	data: formValue,

	beforeSend: function (xhr) {
	    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8");
	},

	contentType: "application/x-www-form-urlencoded; charset=utf-8",
	dataType: "json", 

	success: function (msg, status) {
		alert(msg);
	},
	error: function (xhr, msg, e) {
	    alert("Hata Oluştu!\n" + xhr.responseText +"\n"+msg );
	},

	complete: function() {
		alert('İstek başarıyla gönderildi.');
	}
});
</pre>
 
<span class = "" style = "height: 25px;  float: left; "><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.ahmetkaymaz.com/2010/02/25/jquery-asp-net-post-isleminde-turkce-karakter-sorunu/&layout=standard&send=false&show_faces=false&width=&action=like&colorscheme=light&font=" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:25px"></iframe></span>]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2010/02/25/jquery-asp-net-post-isleminde-turkce-karakter-sorunu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET requestValidationMode ayarı</title>
		<link>http://www.ahmetkaymaz.com/2010/02/24/asp-net-requestvalidationmode-ayari/</link>
		<comments>http://www.ahmetkaymaz.com/2010/02/24/asp-net-requestvalidationmode-ayari/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 13:41:01 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
				<category><![CDATA[C#, VB.NET, ASP.NET]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=345</guid>
		<description><![CDATA[ASP.NET sayfasına POST işlemi yaptığımızda post edilen metin içerisinde &#8220;&#8221; gibi web safyaları için tehlike oluşturabilecek değerler gönderildiği zaman ASP.NET WP, &#8220;A potentially dangerous Request.Form value was detected from the client&#8221; hatasını fırlatır. Bu hatayı engellemek yani kullanıcının bu tür değerleri girmesine izin vermek için ASP.NET sayfasının tanımlama satırına validateRequest=&#8221;false&#8221; ibaresi yazılır. Aynı şekilde uygulamadaki [...]]]></description>
			<content:encoded><![CDATA[<div class="google_plus_one"><g:plusone size="standard" count="true" url="http://www.ahmetkaymaz.com/2010/02/24/asp-net-requestvalidationmode-ayari/"></g:plusone></div><p>ASP.NET sayfasına POST işlemi yaptığımızda post edilen metin içerisinde &#8220;<>&#8221; gibi web safyaları için tehlike oluşturabilecek değerler gönderildiği zaman ASP.NET WP, &#8220;<font color=red>A potentially dangerous Request.Form value was detected from the client</font>&#8221; hatasını fırlatır. Bu hatayı engellemek yani kullanıcının bu tür değerleri girmesine izin vermek için ASP.NET sayfasının tanımlama satırına <b>validateRequest=&#8221;false&#8221;</b> ibaresi yazılır. Aynı şekilde uygulamadaki tüm sayfalar için bu ayarın geçerli olması için Web.Config dosyasına aşağıdaki gibi ekleme yapılabilir.</p>
<p>&lt;pages validateRequest=&quot;false&quot; /&gt; </p>
<p>Cross-site scripting (XSS) attack riskini engellemek için ASP.NET tüm sürümlerinde request validation özelliği varsayılan olarak aktifdir. ASP.NET&#8217;in önceki sürümlerinde bu doğrulama işlemi sadece ASPX sayfaları için yapılmaktaydı. 4.0 sürümüyle birlikte doğrulama işlemi doğrudan BeginRequest aşamasında devreye alınacak şekilde düzenlendi. Böylece uygulamaya gelen tüm istekler için yani sadece ASPX sayfaları değil, Web Servisi çağırma, HTTP handler çalıştırma gibi tüm ASP.NET kaynaklarına istek gönderildiği zaman doğrulama işlemi devreye alınmış oldu.</p>
<p>Bazı durumlarda .NET Framework 4.0 altında eski sürüm ugyulamalarını çalıştırma durumumuz olabilir. Bu durumda hangi sürüm algoritmasının kullanacağını belirtmek için <b>requestValidationMode</b> niteliği kullanılır.</p>
<p>&lt;system.web&gt;<br />
   &lt;httpRuntime requestValidationMode=&quot;2.0&quot; /&gt;<br />
&lt;/system.web&gt;</p>
 
<span class = "" style = "height: 25px;  float: left; "><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.ahmetkaymaz.com/2010/02/24/asp-net-requestvalidationmode-ayari/&layout=standard&send=false&show_faces=false&width=&action=like&colorscheme=light&font=" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:25px"></iframe></span>]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2010/02/24/asp-net-requestvalidationmode-ayari/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UML ve UML Diyagramları &#8211; II</title>
		<link>http://www.ahmetkaymaz.com/2009/09/15/uml-ve-uml-diyagramlari-ii/</link>
		<comments>http://www.ahmetkaymaz.com/2009/09/15/uml-ve-uml-diyagramlari-ii/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 15:25:40 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
				<category><![CDATA[C#, VB.NET, ASP.NET]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=295</guid>
		<description><![CDATA[Bağıntı/İlişki Sınıfları (Association Classes)
Bağıntı sınıfı, iki nesne arasında kurulmuş bağıntı ile başka bir sınıfın ilişkilendirilmesidir. Bu yöntem ana nesneler arasındaki bağıntının kendisine yeni nitelikler kazandırmak için kullanılır. Örneğin öğrenci-ders bağıntısında öğrencinin kayıt tarihi, kayıt ücreti ve kredisi gibi nitelikler ancak öğrenci o derse kayıt olduktan sonra anlam kazanır. Bu nitelikleri bağıntının kendisine tanımlamak gerekir. Diyagram [...]]]></description>
			<content:encoded><![CDATA[<div class="google_plus_one"><g:plusone size="standard" count="true" url="http://www.ahmetkaymaz.com/2009/09/15/uml-ve-uml-diyagramlari-ii/"></g:plusone></div><p><B>Bağıntı/İlişki Sınıfları (Association Classes)</B></p>
<p>Bağıntı sınıfı, iki nesne arasında kurulmuş bağıntı ile başka bir sınıfın ilişkilendirilmesidir. Bu yöntem ana nesneler arasındaki bağıntının kendisine yeni nitelikler kazandırmak için kullanılır. Örneğin öğrenci-ders bağıntısında öğrencinin kayıt tarihi, kayıt ücreti ve kredisi gibi nitelikler ancak öğrenci o derse kayıt olduktan sonra anlam kazanır. Bu nitelikleri bağıntının kendisine tanımlamak gerekir. Diyagram üzerinde bağıntı sınıfları bağıntıya kesik çizgi ile bağlanır.<span id="more-295"></span></p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/UML_Temel_Diyagramlari_10.jpg"></p>
<p><B>Genelleştirme İlişkisi (Generalization)</B></p>
<p>Bir nesnenin bir diğerinin özel türü olduğunu göstermek için kullanılır. Diyagram üzerinde nesneler genelden özele doğru ağaç görünümünde yerleştirilir. Nesne yönelimli programlamadaki karşılığı <I><B>kalıtım (inheritance)</B></I> kavramıdır. Alt nesneler içi boş bir ok simgesiyle üst nesneye bağlanır. Aşağıdaki örnekte bir şirkete ait kişilerin genellemesi gösterilmiştir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/UML_Temel_Diyagramlari_11.jpg"></p>
<p>Bu gösterime göre &#8220;Müdür&#8221; nesnesi &#8220;Kişi&#8221; nesnesinin özel türüdür. Genelleştirme işleminin temelinde sınıflandırma işlemi yapılır. Alt nesneler farklı kriterlere göre gruplandırılabilir. Örneğin önceki gösterimde soldaki nesneler cinsiyetlerine göre, sağdaki nesneler ünvanlarına göre sınıflandırılmıştır.</p>
<p><B>Bağımlılık ilişkisi (Dependency)</B></p>
<p>İki nesne arasındaki anlamsal ilişkiyi modellemek için kullanılır. Bir sınıfın başka bir sınıfı kullanması durumunda ortaya çıkar. Bu ilişkide rol oynayan sınıflardan biri <I>bağımlı</I> diğeri <I>bağımsız</I> niteliktedir. Bağımlı nesnenin niteliklerinden biri bağımsız nesneyi referans olarak kullanır. Bu durumda bağımsız nesnedeki değişiklik bağımlı nesnenin anlamını değiştir. Bağımlılık ilişkisi, bağımlı sınıftan bağımsız sınıfa doğru kesikli çizgi ile ifade edilir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/UML_Temel_Diyagramlari_12.jpg"></p>
<p>Sağdaki üç nesne <I>Alışveriş</I> nesnesinin yordamlarında parametre olarak kullanılmaktadır. Yani Alışveriş nesnesi bu nesneleri kullanır. Bu yüzden bu nesnelerde yapılacak bir değişiklik <I>Alışveriş</I> nesnesinde değişikliğe neden olur.</p>
<p><B>Gerçekleştirim ilişkisi (Realization)</B></p>
<p>Arabirim yapılarından türemiş nesne yapısını modellemek için kullanılır. Bilindiği gibi arabirimler bir sınıfın temelde hangi üyelerden oluşacağını belirleyen şablonlardır. Bu şablonlar, oluşturulacak sınıflara öncülük eder ve içermeleri gereken üyelerin tanımlamaları için yol gösterir. Arabirimler nitelik içermez sadece fonksiyonlar içerir. OOP&#8217;deki karşılığı gerçekleştirmek olan <I>gerçekleştirim ilişkisi</I> kesikli bir çizgiye sahip iç boş bir üçgenle ifade edilir. Aşağıdaki örnekte Müşteri sınıfı IKişi arabirimini uygulamıştır.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/UML_Temel_Diyagramlari_13.jpg"></p>
<p>Gerçekleştirim ilişkisi aşağıdaki şekilde de gösterilebilir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/UML_Temel_Diyagramlari_14.jpg"></p>
<p><B>Ardışıllık (Etkileşim) Diyagramları  (Sequence Diagrams)</B></p>
<p>Sınıf diyagramı sistemin durağan yapısını gösterir. Fakat gerçek yaşamda olduğu gibi sistem üzerinde nesneler zamanla durumlarını değiştirir ve birbirleriyle etkileşime geçerler. Bu dinamik davranışları modellemek için ardışıllık (etkileşim)  ve durum diyagramları kullanılır. Nesneler arasındaki etkileşim yordamlar üzerinden gerçekleşir. Ardışıllık diyagramları, nesneler arasında yordam çağırma işlemlerinin zaman çizgisindeki sıralı gösterimini modeller. Zaman çizgisi dikey eksen üzerinde yukarıdan aşağı, ilişkili nesneler ise yatay eksen üzerinde en üstte soldan sağa sıralanır. Bir nesneden diğer bir nesneye mesaj gönderileceği zaman mesaj yönüne uygun bir ok çizilir ve mesaj okun üzerine yazılır. Geri dönüş mesajı kesik çizgili ok ile ifade edilir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/UML_Temel_Diyagramlari_15.jpg"></p>
<p><B>Durum Şeması Diyagramları (Statechart Diagrams)</B></p>
<p>Nesnelerin sistem içerisinde meydana gelen olaylara karşı nasıl davranış sergilediğini modellemek için kullanılır. Nesneler <B>olaylar</B> aracılığıyla tetiklenerek durumlarını değiştirirler ve bu esnada tanımlı bazı işlemleri de çalıştırabilirler. Bir nesnenin durumları arasındaki geçiş <B>transition</B> simgesiyle ifade edilir. Nesnenin yaşamı sonlandığında, aldığı durum <B>final state</B> simgesiyle ifade edilir. Aşağıdaki diyagramda sipariş sürecinin durumu modellenmiştir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/UML_Temel_Diyagramlari_16.jpg"></p>
<p><B>Örnek: Bir e-ticaret uygulamasında sipariş</B></p>
<p>Bir e-ticaret projesinin önemli nesnelerinden birisi olan sipariş ve onunla ilgili nesneler bir sonraki sayfada verilen UML diyagramında olduğu gibi modellenebilir.<br />
Verilen diyagram aşağıdaki gibi yorumlanabilir:</p>
<ul>
<li>Bu projede iki tür müşteri bulunmaktadır; genelleştirme (generalization). Müşteriler ya doğrudan İnternet’ten kendileri sipariş verebilir veya bir mağazaya gidip oradan sipariş verebilirler.</li>
<li>Müşteri nesnesi için bir koşul/kısıt (constraint) tanımlanmıştır. Bu koşula göre, ancak ve ancak siteye üye girişi yapmış kişiler sipariş verebilir.</li>
<li>Müşteri ile sipariş arasında ilişki vardır. Bir müşterinin 0 veya daha fazla sayıda siparişi olabilir (0..*). Fakat bir sipariş ancak bir tek müşteriye (1) bağlı olabilir. Bir siparişte en az 1 ürün vardır (1..*) ve bir sipariş en az bir ödeme şekline sahiptir (1..*).</li>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/UML_Temel_Diyagramlari_17.jpg"></p>
<li>Sipariş ile &#8220;sipariş detay&#8221; arasında oluşum (composition) bağıntısı vardır. Sözkonusu sipariş silindiği zaman o siparişe ilişkin ayrıntı detay kayıtlar da silinir. &#8220;Sipariş detay&#8221; ile ürün arasında içerim (aggregation)  bağıntısı vardır. Bu durumda sipariş detay kaydı silindiği zaman o kayıtla ilişkili ürün nesnesi silinmez.</li>
<li>Bir müşterinin sistemde 0 (sıfır) veya daha fazla sayıda adresi tanımlı olabilir. Her siparişin bağlı olduğu iki adres vardır. Bu adreslerden biri fatura adresi diğeri teslimat adresi olarak kullanılır ve her sipariş için ancak 1 (bir) fatura adresi ve 1 (bir) teslimat adresi tanımlanabilir.</li>
</ul>
 
<span class = "" style = "height: 25px;  float: left; "><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.ahmetkaymaz.com/2009/09/15/uml-ve-uml-diyagramlari-ii/&layout=standard&send=false&show_faces=false&width=&action=like&colorscheme=light&font=" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:25px"></iframe></span>]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2009/09/15/uml-ve-uml-diyagramlari-ii/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>UML ve UML Diyagramları &#8211; I</title>
		<link>http://www.ahmetkaymaz.com/2009/09/14/uml-ve-uml-diyagramlari-i/</link>
		<comments>http://www.ahmetkaymaz.com/2009/09/14/uml-ve-uml-diyagramlari-i/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 13:18:45 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
				<category><![CDATA[C#, VB.NET, ASP.NET]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=289</guid>
		<description><![CDATA[Bir yazılım projesinde herşeyden önce o proje ile ilgili yol haritası olan proje taslağı oluşturulmalıdır. Proje taslağı onun başarısıyla doğru orantılı olup projenin zaman ve iş gücü açısından verimli sonuçlanmasını sağlar. Bu yöntem aynı bir inşaat projesinde olduğu gibi bir yazılım projesinde de başarı faktörü olarak karşımıza çıkar. Proje/iş tasarlamanın ilk adımı proje içerisindeki aktif [...]]]></description>
			<content:encoded><![CDATA[<div class="google_plus_one"><g:plusone size="standard" count="true" url="http://www.ahmetkaymaz.com/2009/09/14/uml-ve-uml-diyagramlari-i/"></g:plusone></div><p>Bir yazılım projesinde herşeyden önce o proje ile ilgili yol haritası olan proje taslağı oluşturulmalıdır. Proje taslağı onun başarısıyla doğru orantılı olup projenin zaman ve iş gücü açısından verimli sonuçlanmasını sağlar. Bu yöntem aynı bir inşaat projesinde olduğu gibi bir yazılım projesinde de başarı faktörü olarak karşımıza çıkar. Proje/iş tasarlamanın ilk adımı proje içerisindeki aktif oyuncuların anlayabileceği standart bir modelleme yapmaktır. Bir mühendislik yaklaşımı olan modelleme, karmaşık bir sistemin şekil ve metinlerle basit bir dil ile ifade edilmesidir. <span id="more-289"></span></p>
<p>Yazılım mühendisliğinde modelleme için çeşitli çalışmalar yapılmış olsa da bunlardan en önemlisi ve geçerli olanı ilk olarak 1998 yılında OMG (Object Management Group) tarafından kabul gören UML 1.1 (The Unified Modeling Language / Birleşik Modelleme Dili) standardıdır. [Aytaç-2006]</p>
<p>UML, bir programlama dili olmayıp karmaşık yazılım projelerinin programlama dillerinden bağımsız, daha basit bir şekilde ifade eden görsel modelleme dilidir. Yazılım mühendisleri UML yöntemini geliştirme sürecinin ilk iki basamağı olan analiz/çözümleme ve tasarım süreçlerinde kullanırlar. UML, projedeki teknik ve teknik olmayan kişiler arasındaki iletişimi kolaylaştırır. UML aynı zamanda gerçek sistemin resmini gösterdiği için hem sistemin özellikleri ve eksikliklerini gösterir hem de bakım sürecini kolaylaştırır; yazılım projelerinin, özellikle nesneye yönelik programlama dili kullanılıyorsa, daha sağlıklı bir süreç içerisinde geliştirilmesine yardımcı olur. Ayrıca, projenin davranışını da açıkça gösterir.</p>
<p>Geniş bir kullanım alanına sahip olan UML yalnızca yazılım geliştirme alanında değil iş süreçleri, ağ yapıları ve veri sistemlerini modellemek için de kullanılır. Bu modelde standart işaret ve metinler kullanıldığı için ortaya çıkan tasarım, uzmanlığı ve dili farklı olsa da birçok kişi tarafından kolayca anlaşılabilir. </p>
<p>UML tasarımı, elemanlar ve bunların oluşturduğu diyagramlardan oluşur. Elemanlar, nesnelere ait özellikleri, işlevleri ve nesneler arasındaki yapısal ilişkiyi temsil eder. Diyagramlar ise, sistemin farklı süreçlerdeki yapısını ve davranışını temsil eder. UML tasarımında 9 temel diyagram kullanılır. </p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/UML_Temel_Diyagramlari_1.jpg"></p>
<p>Bir sistem gereksinimlerinin modellenmesi <I>kullanıcı senaryosu diyagramı</I> ve <I>etkinlik diyagramı</I> aracılığıyla gerçekleştirilir.<br />
Sistemin tanımı ve yüzeysel içeriği <I>bileşen diyagramı</I> ile <I>nesne diyagramı</I> aracılığıyla gerçekleştirilir.<br />
Sistemin tasarımı ve ayrıntılı içeriği <I>sınıf diyagramı, ardışıl (etkileşim) diyagramı, işbirliği diyagramı ve durum şeması diyagramı</I> aracılığıyla gerçekleştirilir.<br />
UML tasarımı için birçok araç bulunmaktadır; araç seçiminde dikkat edilmesi gereken unsur onun VS.NET ile bütünleşik çalışıyor olmasıdır; kod üretimine sahip olması ve mümkünse .NET Framework dillerine destek vermesidir. Ayrıca kullanıcı dostu ekranlara da sahip olması tercih nedeni olabilir. Bu amaçla <I>MS Visio, Rational Rose, SmartDraw, Metamill veya Visual Paradigm</I> araçları kullanılabilir. Kitabımızdaki UML tasarımları için &#8220;MS Visio&#8221; tercih edilmiştir.  Aynı şekilde bu dillerdeki bir koda ait analiz ve tasarım modeli de oluşturulabilir. Ancak konumuz .NET olduğu için UML elementlerinin .NET Framework&#8217;teki hangi yapılara denk geldiğinin verilmesi yararlı olacaktır.</p>
<p><U><B>.NET Framework ve karşılık düşen UML elementleri:</B></U></p>
<p><B>İsim-uzayı (Namespace):</B> İsim-uzayının UML tarafındaki karşılığı package elementidir.<br />
<B>Sınıf (Class):</B> Sınıfın UML tarafındaki karşılığı class elementidir; new, internal gibi sınıfı yapıcıları UML tarafında desteklenmez.<br />
<B>Arabirim (Interface):</B> Arabirimin UML tarafındaki karşılığı interface elementidir.<br />
<B>Numaralandırma türü (Enumerated type):</B> Numaralandırma türünün UML karşılığı &lt;&lt;enum&gt;&gt; şablonunu (stereotype) kullanan data type elementidir. Stereotype ifadeleri mevcut UML modelini genişletmek amacıyla modele yeni özellik ve element eklemek için kullanılır.<br />
<B>Yapı (Struct):</B> Yapının UML karşılığı &lt;&lt;struct&gt;&gt; şablonunu kullanan data type elementidir.<br />
<B>Özellik (Property) ve Yordam (Method):</B> Özellik ve yordamların UML dilindeki karşılığı operation kavramıdır. Yordam parametreleri UML parameter kavramıyla karşılanır.<br />
Delege/Temsilce (Delegate): Temsilcinin UML karşılığı &lt;&lt;delegate&gt;&gt; şablonunu kullanan data type elementidir.<br />
<B>Sabit (Constant) ve Değişken (Variable):</B> Sabit ve değişkenlerin UML dilindeki karşılığı attribute kavramıdır.</p>
<p><B>Kullanıcı Senaryosu Diyagramları (Use Case Diagrams)</B></p>
<p>Yazılım geliştirme sürecinde az kullanılan bu diyagram/çizelge, sistem üzerindeki muhtemel kullanıcı senaryolarını modellemek için tercih edilir. Belirlenen senaryolarda sistemin ne yaptığı yüzeysel olarak aktarılır; sistemin amacını ve ayrıntılarını vermez. Bu modelde aktör olarak tanımlanan kullanıcı bir senaryoyu başlatır ve varsa oluşan sonucu başka bir kullanıcıya aktarır. Diyagram üzerinde senaryolar elips şeklinde çizilir. Kullanıcı ile senaryo arasındaki ilişki düz bir çizgiyle belirtilir. Bu modelde senaryolar arasında <B>içerme (inclusion)</B> ve <B>genişleme (extension)</B> olmak üzere iki tür ilişki kurulabilir. İçerme ilişkisi bir ana senaryonun bir alt senaryo içerdiğini belirtir. Söz konusu alt senaryo birden fazla senaryo tarafından kullanılır. Bu senaryolar arasında noktalı bir çizgi çizilir ve üzerine &lt;&lt;include&gt;&gt; (Visio&#8217;da  &lt;&lt;uses&gt;&gt;) ifadesi yazılır. Genişleme ilişkisi mevcut senaryoya yeni bir senaryo eklemek için kullanılır. Bu ilişkiyi belirtmek için noktalı çizginin üzerinde &lt;&lt;extension&gt;&gt; ifadesi yazılır.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/UML_Temel_Diyagramlari_2.jpg"></p>
<p>Kullanıcının sipariş oluşturması için öncelikle sisteme giriş yapması ve sözleşmeyi kabul etmesi gerekir. Müşteri siparişini iptal ettikten sonra sistemin log dosyasına not düşmesi de ek bir adım olarak eklenmiştir.<br />
Sonuç olarak kullanıcı senaryosu (use case) diyagramı aracılığıyla bu modele bakan birisi sistemin ne yaptığının kabaca anlayabilir, görebilir.</p>
<p><B>Sınıf Diyagramları (Class Diagrams)</B></p>
<p>Projenin durağan yapısının modellenmesi için kullanılır. Nesne yönelimli programlama yaklaşımının temelini teşkil eden sınıflar (class) tıpkı gerçek yaşamda olduğu gibi modellenir; onlara ait özellikler ve davranışlar belirlenip diyagram üzerinde çizilir. UML dilinde sınıflar üç bölümden oluşan dikdörtgen şekliyle temsil edilir. Dikdörtgenin birinci bölümüne sınıfın adı, ikinci bölümünde sınıfa ait özellikler, üçüncü bölüme de sınıfın sahip olduğu işlevler yazılır. Her sınıfın mutlaka özelliği olmak zorunda değildir. İşlevler, sınıfın yeteneğini ifade eder. İşlevler tanımlanırken aldıklar veya geri döndürdükleri parametreler de girilir. Ayrıca sınıflar için ek notlar ve koşullar, kısıtlamalar da diyagram üzerinde tanımlanabilir. Aşağıdaki şekilde Kitap sınıfı ve ona ait karakter ve davranışlar gösterilmiştir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/UML_Temel_Diyagramlari_3.jpg"></p>
<p>Diyagram üzerinde sınıflar erişim belirleyicilerine göre işaretlenir. Örneğin özel (private) üyeler &#8216;-&#8217;, herkese açık (public) üyeler &#8216;+&#8217;, korumalı (protected) üyeler &#8216;#&#8217; ile gösterilir.<br />
Sınıf diyagramı üzerinde aynı zamanda varsa sınıflar arasındaki ilişkiyi de görüntüleyebiliriz. UML yaklaşımında sınıflar arasında genel olarak 4 tür ilişki kurulur:<br />
<UL><br />
<LI>Bağıntı ilişkisi (Binary association) / İçerim (Aggregation), Oluşum (Composition)</LI><br />
<LI>Genelleştirme ilişkisi (Generalization)</LI><br />
<LI>Bağımlılık ilişkisi (Dependency)</LI><br />
<LI>Gerçekleştirim ilişkisi (Realization)</LI><br />
</UL></p>
<p><B>Bağıntı İlişkisi (Binary Association).</B><br />
Bir nesnenin başka bir nesneyle olan yapısal bağını gösterir. Bu bağ diyagram üzerinde düz bir çizgiyle gösterilir. İki sınıf arasında ilişki kurulduğunda ilişki alanının üzerinde sınıfların ilişkideki görevi, ilişkinin yönü, türü ve ilişkinin çokluğu da belirtilir. Sınıflar arasında <I>&#8220;bire-sıfır&#8221;, &#8220;bire-bir&#8221;, &#8220;bire-çok&#8221;</I> türünde ilişkiler kurulabilir. Bu ilişkinin tanımları daha önce işlediğimiz &#8220;Entity Relationship (ER) Modeling&#8221; konusunda verildi. UML diyagramlarında bağıntının yönü &#8216;►&#8217; simgesiyle gösterilir; nesnelerin bağıntıdaki rolleri kendilerinin alt tarafında, ilişki çokluğu gösterilir. İlişkinin türü <I>&#8220;1,* &#8211; sayı/çokluk&#8221;</I> şeklinde belirtilir. Muhtemel ilişkileri temsil eden simgeler aşağıdaki tabloda gösterilmiştir:</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/UML_Temel_Diyagramlari_4.jpg"></p>
<p>Aşağıda verilen şekilde bağıntı ilişkisi örneklendirilmiştir:</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/UML_Temel_Diyagramlari_5.jpg"></p>
<p>Müşteri-sipariş ilişkisinde bağıntının yönü müşteri nesnesinden sipariş nesnesine doğru verilmiştir. Bu gösterimi soldan sağa doğru okuduğumuzda &#8220;<I>her müşteri 0 ya da herhangi bir sayıda siparişe sahiptir (0..*)</I>&#8220;, &#8220;<I>her sipariş yalnızca bir müşteri tarafından verilebilir (1..1)</I>&#8221; sonuçları çıkar.<br />
Aşağıdaki gösterim ise &#8220;<I>bir şirketin en az 1 işçisi vardır</I>&#8221; ve &#8220;<I>bir işçi 0 veya herhangi bir sayıda şirkette çalışmış olabilir</I>&#8221; olarak yorumlanabilir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/UML_Temel_Diyagramlari_6.jpg"></p>
<p>Bu basit bağıntı türü dışında <B>içerim (aggregation/shared)</B> ve <B>oluşum (compo-sition)</B> olmak üzere iki özel bağıntı türü daha vardır.<br />
İçerim bağıntı türü iki sınıf arasındaki &#8220;sahiptir&#8221; veya &#8220;içerir&#8221; ilişkilerini modeller. Diyagram üzerinde bu bağıntı, içeren (sahiplenen) sınıf tarafına yerleştirilen boş bir baklava dilimi simgesiyle gösterilir. &#8220;n:m&#8221; çokluk değerine sahiptir.<br />
Oluşum/kompozisyon bağıntı türü, içerimin daha güçlü özel bir durumu olup parça-bütün ilişkisini modellemede kullanılır. &#8220;Parça&#8221; nitelikli nesne, &#8220;bütün&#8221; nitelikli nesneyle anlam kazanır. Bu bağıntı &#8220;bütün&#8221; sınıf tarafında yerleştirilen dolu bir baklava dilimi simgesiyle gösterilir. &#8220;1:n&#8221; çokluk değerine sahiptir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/UML_Temel_Diyagramlari_7.jpg"></p>
<p>Bu iki bağıntı türü yüzeysel olarak birbirine benzese de aralarında iki önemli fark bulunmaktadır.<br />
<UL><br />
<LI>İçerim bağıntı türünde ikinci nesne birinci nesne dışında da sistem içinde kullanılabilir; yani aynı &#8220;parça&#8221; başka bir &#8220;bütün&#8221; tarafından da kullanılabilir. Örneğin bir öğrenci birden fazla öğretmenin öğrencisi olabilir. Oluşum bağıntı türünde  ise ikinci nesne birinci nesneden bağımsız olarak kullanılamaz; yani bir &#8220;parça&#8221; aynı anda tek bir &#8220;bütün&#8221;e ait olabilir. Örneğin her motor tek bir otomobil tarafından kullanılabilir. Bu farktan dolayı bazı kaynaklarda içerim bağıntı <I>bağımsız iyelik</I>, oluşum bağıntı da <I>bağımlı iyelik</I> olarak isimlendirilir. Bununla birlikte her oluşum bağıntısı aynı zamanda bir içerim bağıntısıdır.</LI><br />
<LI>Oluşum türünde &#8220;parça&#8221;nın yaşam süresi doğrudan bütünün yaşam süresine bağlıdır. &#8220;Bütün&#8221; nesnesi oluşturulmadan &#8220;parça&#8221; nesnesi oluşturulamaz ve &#8220;bütün&#8221; nesnesi silindiğinde &#8220;parça&#8221; nesneler de onunla birlikte silinir. Örneğin &#8220;ürün grup&#8221; nesnesi silindiğinde o grupla ilişkili ürünün yaşamı da sonlanır. İlişkisel veritabanı sisteminde aralarında oluşum bağıntısı tanımlanmış tablolarda ana kayıt silindiğinde ayrıntı tablosundan da ilgili kayıtların silinmesi gerekir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/UML_Temel_Diyagramlari_8.jpg"></p>
<p>Son olarak, iki sınıf arasında birden fazla bağıntı çizilebilir veya bir sınıf kendisiyle ilişkilendirilebilir. Örneğin, şirket bileşeni için &#8220;işçi&#8221; diye bir nesne tanımladığımız bir müdür, hem işçi hem de yönetici rollerine sahiptir. Aşağıdaki örneği inceleyelim:</LI></p>
<p> <img src="http://www.ahmetkaymaz.com/wp-content/uploads/UML_Temel_Diyagramlari_9.jpg"></p>
<p><LI>Bir futbol takımının 11 oyuncusu vardır. Bunlardan birisi kaptandır. Yani oyuncular iki gruba ayrılmıştır. Bir grup normal oyuncu diğer grup kaptan olarak görev yapar.</LI><br />
<LI>Bir oyuncu yalnızca bir takım için oynayabilir.</LI><br />
<LI>Takımın kaptanı normal oyuncuları yönetir.</LI></UL></p>
 
<span class = "" style = "height: 25px;  float: left; "><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.ahmetkaymaz.com/2009/09/14/uml-ve-uml-diyagramlari-i/&layout=standard&send=false&show_faces=false&width=&action=like&colorscheme=light&font=" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:25px"></iframe></span>]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2009/09/14/uml-ve-uml-diyagramlari-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CETURK &#8220;Microsoft Teknolojileri Etkinliği&#8221;</title>
		<link>http://www.ahmetkaymaz.com/2009/02/09/ceturk-microsoft-teknolojileri-etkinligi/</link>
		<comments>http://www.ahmetkaymaz.com/2009/02/09/ceturk-microsoft-teknolojileri-etkinligi/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 15:38:01 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
				<category><![CDATA[C#, VB.NET, ASP.NET]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=258</guid>
		<description><![CDATA[CETURK, 7 Şubat Cumartesi günü Microsoft Türkiye İstanbul Ofisi&#8216;nde benim de Ado.Net 3.5 / Ado.Net Entity Framework konusuyla konuşmacı olarak katıldığım Microsoft Teknolojileri Etkinliği&#8216;ni düzenledi. Benim açımdan iş ve sosyal hayat olarak yoğun bir haftaya denk gelmesi, hediye olarak verdiğimiz kitapları yetiştirmek için ciddi bir zaman harcamış olmam ve bunun sonucunda kendi sunum saatine yetişemememden [...]]]></description>
			<content:encoded><![CDATA[<div class="google_plus_one"><g:plusone size="standard" count="true" url="http://www.ahmetkaymaz.com/2009/02/09/ceturk-microsoft-teknolojileri-etkinligi/"></g:plusone></div><p>CETURK, <b>7 Şubat Cumartesi</b> günü </b>Microsoft Türkiye İstanbul Ofisi</b>&#8216;nde benim de <b>Ado.Net 3.5 / Ado.Net Entity Framework</b> konusuyla konuşmacı olarak katıldığım <b>Microsoft Teknolojileri Etkinliği</b>&#8216;ni düzenledi. Benim açımdan iş ve sosyal hayat olarak yoğun bir haftaya denk gelmesi, hediye olarak verdiğimiz kitapları yetiştirmek için ciddi bir zaman harcamış olmam ve bunun sonucunda kendi sunum saatine yetişemememden dolayı etkin bir performans sergileyememiş olsam da benim için faydalı oldu. Konu katılımcı profiliyle ne kadar uyuştu veya onların ne kadar ilgisini çekti bilemiyorum ancak birkaç arkadaşın bu konularda ürün çıkaracak kadar çalışıyor olmaları beni daha da cesaretlendirdi. Tüm katılımcılara ve etkinliği düzenleyen CETURK ekibine de teşekkür ederim. Oturumumla ilgili sunumu aşağıda bulabilirsiniz.</p>
<div style="width:425px;text-align:left" id="__ss_1028230">
<object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=ahmetkaymazceturketkinlik7subatyazilimsurecleri-1234639149714544-3&#038;stripped_title=ahmet-kaymaz-ceturk-etkinlik-7-subat-yazilim-surecleri" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=ahmetkaymazceturketkinlik7subatyazilimsurecleri-1234639149714544-3&#038;stripped_title=ahmet-kaymaz-ceturk-etkinlik-7-subat-yazilim-surecleri" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div>
<p><i>Etkinlikle ilgili detayları <a href="http://www.ahmetkaymaz.com/go.php?http://www.ceturk.com/etkinlikkayit.asp?id=63" target="_blank">http://www.ceturk.com/etkinlikkayit.asp?id=63</a> adresinde bulabilirsiniz.</i></p>
 
<span class = "" style = "height: 25px;  float: left; "><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.ahmetkaymaz.com/2009/02/09/ceturk-microsoft-teknolojileri-etkinligi/&layout=standard&send=false&show_faces=false&width=&action=like&colorscheme=light&font=" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:25px"></iframe></span>]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2009/02/09/ceturk-microsoft-teknolojileri-etkinligi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web Kontrol Geliştirme &#8211; III [Rendered Control]</title>
		<link>http://www.ahmetkaymaz.com/2008/05/11/web-kontrol-rendered-control/</link>
		<comments>http://www.ahmetkaymaz.com/2008/05/11/web-kontrol-rendered-control/#comments</comments>
		<pubDate>Sun, 11 May 2008 21:54:18 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
				<category><![CDATA[C#, VB.NET, ASP.NET]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=267</guid>
		<description><![CDATA[Özel şekillendirilmiş kontrol olarak tanımlayacağımız bu kontroller, Control veya WebControl sınıflarından doğrudan türetilmiş olup, programcı tarafından belirlenmiş HTML içeriği render eder. WebControl sınıfı, Control sınıfından inherit edilmiş olup Control sınıfının özellikleriyle beraber kontrollerin renk, font gibi görsel yönlerinin yönetilmesini sağlayan özellikler sunar. Bu yöntemle geliştirilmiş kontrolün tag yapısını ve içeriğini genellikle programcı HTML ifadeler yazarak [...]]]></description>
			<content:encoded><![CDATA[<div class="google_plus_one"><g:plusone size="standard" count="true" url="http://www.ahmetkaymaz.com/2008/05/11/web-kontrol-rendered-control/"></g:plusone></div><p>Özel şekillendirilmiş kontrol olarak tanımlayacağımız bu kontroller, <b>Control</b> veya <b>WebControl</b> sınıflarından doğrudan türetilmiş olup, programcı tarafından belirlenmiş HTML içeriği render eder. <b>WebControl</b> sınıfı, <b>Control</b> sınıfından inherit edilmiş olup <b>Control</b> sınıfının özellikleriyle beraber kontrollerin renk, font gibi görsel yönlerinin yönetilmesini sağlayan özellikler sunar. Bu yöntemle geliştirilmiş kontrolün tag yapısını ve içeriğini genellikle programcı HTML ifadeler yazarak oluşturur. Bunu da daha önce kendisinden bahsettiğimiz <b>HtmlTextWriter</b> nesnesi aracılığıyla yapar. Bu bölümde daha detaylı göreceğimiz <b>HtmlTextWriter</b> sınıfı, kontrolleri render edip HTML çıktısını oluşturma, elementlere ait attribute tanımlamaları yapma, style attribute oluşturma gibi servisleri sağlar. <span id="more-267"></span><b>HtmlTextWriter</b> sınıfının bu amaçla kullanılan önemli metodları şunlardır;</p>
<p><b>AddAttribute():</b> RenderBeginTag() metodu tarafından açılmış HTML tagına attribute ekler.</p>
<p><b>AddStyleAttribute():</b> RenderBeginTag() metodu tarafından açılmış HTML tagına CSS attribute ekler.</p>
<p><b>RenderBeginTag():</b> Bir başlangıç HTML tagını render eder.</p>
<p><b>RenderEndTag():</b> Bir bitiş HTML tagını render eder.</p>
<p><b>Write():</b> Browserda görünmek üzere düz metin yazdırır.</p>
<p><b>WriteBreak():</b> &lt;br/&gt; HTML tagını yazdırır.</p>
<p><b>AddAttribute()</b> veya <b>AddStyleAttribute()</b> methodlarını ihtiyacımız kadar birden fazla kullanabiliriz. Bu tür metodları, <b>RenderBeginTag()</b> metodundan önce çağırmaya dikkat etmeliyiz. <b>RenderBeginTag()</b> metodu çalıştığı zaman bütün attributeler açılış tagına eklenmiş olur.</p>
<p>HtmlTextWriter sınıfına ait bu metodlar parametre olarak string veya aşağıdaki enumeration türündeki değerleri alır;</p>
<p><b>HtmlTextWriterTag:</b> En çok kullanılan HTML taglarının listesini içerir.</p>
<p><b>HtmlTextWriterAttribute:</b> En çok kullanılan HTML attributelerinin listesini içerir.</p>
<p><b>HtmlTextWriterStyle:</b> En çok kullanılan CSS attributelerinin listesini içerir.</p>
<p>Özel kontrol geliştirirken işlemlerin doğru zamanda gerçekleşmesi açısından taban aldığımızın sınıfın(Control veya WebControl) hangi metodlarını override edeceğimiz önem arzetmektedir. <b>Control</b> ve <b>WebControl</b> sınıfların ortak ve ayrık metodları bulunur. Yeri geldikçe bu metodlardan bahsedeceğiz. Şimdilik WebControl&#8217;ün başlangıç için bilmemiz gereken metodlarından bahsedelim;</p>
<p><b>RenderBeginTag():</b> Açılmış HTML tagını açılma aşamasında özel bir içerikle render etmek için kullanılır. Parametre olarak HtmlTextWriter türünde değer alır.</p>
<p><b>RenderEndTag():</b> Açılmış HTML tagını kapatılma aşamasında özel bir içerikle render etmek için kullanılır. Parametre olarak HtmlTextWriter türünde değer alır.</p>
<p><b>ApplyStyle():</b> Web kontrolüne style uygulamak için kullanılır. Parametre olarak System.Web.UI.WebControls.<b>Style</b> türünde değer alır.</p>
<p><b>CopyBaseAttributes() :</b> Bir web server kontrolünün Style sınıfından türememiş olan property&#8217;lerini bu metodu çağıran kontrole kopyalamak için kullanılır. CopyBaseAttributes() metodu, <b>WebControl</b> türünde parametre alıp kaynak kontrolün <b>AccessKey, Enabled, ToolTip, TabIndex</b> ve <b>Attributes</b> property&#8217;lerini kopyalar.</p>
<p><b>Render():</b> HtmlTextWriter türünde değer alarak kontrolün istemci tarafındaki HTML element içeriğini oluşturur.</p>
<p>Bir ASP.NET sayfası çalıştırıldığı zaman, sayfa içerisindeki web kontrollerinin <b>RenderControl()</b> metodlarına HtmlTextWriter nesnesi gönderilerek çağrılır. <b>RenderControl()</b> metodu, kontrole ait protected modundaki <b>Render()</b> metoduna elçilik eder. <b>Render()</b> metodu, <i>RenderBeginTag(), RenderContents()</i> ve <i>RenderEndTag()</i> metodlarını uygular. Bu üç metod da daha önce parametre olarak RenderControl() metoduna gönderilmiş aynı HtmlTextWriter nesnesini kullanılır. Her metod, görevleri doğrultusunda oluşturduğukları HTML çıktıyı, HtmlTextWriter nesnesine ekler. Bu metodların tamamlanmasından sonra ASP.NET engine, kontrolden geri dönen HtmlTextWriter nesnesini handle eder ve ona göre browsera gönderilecek HTML çıktıya ekler. Custom kontrol geliştiriken bu metodların hepsi kullanılmak zorunda değildir. Sadece <b>Render()</b> veya <b>RenderContents()</b> metodlarıyla ilgili HTML çıktı oluşturulabilir.</p>
<p>Doğrudan Control sınıfından inherit edilmiş custom kontrollerde genellikle <b>Render()</b> metodu kullanılır. Aşağıdaki örnekte basit bir custom kontrol kodu gösterilmiştir. Bu kontrol, büyüklüğü ve rengi bizim tarafımızdan belirlenen bir başlık oluşturur.</p>
<p><b>[Baslik.vb]</b></p>
<pre name="code" class="vb">Imports System.Web.UI 'Control,HtmlTextWriter

Namespace OrnekWebKontrol
    Public Class Baslik : Inherits Control
        Private _boyut As Integer
        Private _metin As String

        'Başlığın font büyüklüğü
        Public Property Boyut() As Integer
            Get
                Return _boyut
            End Get
            Set(ByVal value As Integer)
                _boyut = Value
            End Set
        End Property 'Boyut

        'Başlığın içeriği
        Public Property Metin() As String
            Get
                Return _metin
            End Get
            Set(ByVal value As String)
                _metin = Value
            End Set
        End Property 'Metin

        Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
            writer.Write("&lt;font size=" &#038; _boyut &#038; "&gt;")
            writer.Write(_metin)
            writer.Write("&lt;/font&gt;")
            MyBase.Render(writer)
        End Sub
    End Class 'Baslik
End Namespace 'OrnekWebKontrol</pre>
<p><b>[Baslik.cs]</b></p>
<pre name="code" class="csharp">using System.Web.UI; //Control,HtmlTextWriter

namespace OrnekWebKontrol
{
    public class Baslik : Control
    {
        private int _boyut;
        private string _metin;

        //Başlığın font büyüklüğü
        public int Boyut
        {
            get
            {
                return _boyut;
            }
            set
            {
                _boyut = value;
            }
        }//Boyut

        //Başlığın içeriği
        public string Metin
        {
            get
            {
                return _metin;
            }
            set
            {
                _metin = value;
            }
        }//Metin

        protected override void Render(HtmlTextWriter writer)
        {
            writer.Write("&lt;font size=" + _boyut + "&gt;");
            writer.Write(_metin);
            writer.Write("&lt;/font&gt;");
            base.Render(writer);
        }
    }//Baslik
}//OrnekWebKontrol</pre>
<pre name="code" class="html"><%@ Register Assembly="OrnekWebKontrol"
	Namespace="OrnekWebKontrol" TagPrefix="cc1" %>
. . . . .
<form id="form1" runat="server">
    <cc1:Baslik ID="Baslik1" runat="server"
        Boyut="4" Metin="En çok satanlar">
    </cc1:Baslik>
</form>
</pre>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Web_Custom_Control_3.jpg"></p>
<p>Örneğimizi, konunun başında bahsettiğimiz metodları kullanarak ta oluşturabiliriz. Baslik dosyasına ZeminRenk isimli bir property ekleyip Render metodunu aşağıdaki gibi düzenleyelim.</p>
<p><b>[Baslik.vb]</b></p>
<pre name="code" class="vb">Public Class Baslik : Inherits Control
        . . .
        Private _zeminRenk As String

        'Fontun zemin rengi
        Public Property ZeminRenk() As String
            Get
                Return _zeminRenk
            End Get
            Set(ByVal value As String)
                _zeminRenk = Value
            End Set
        End Property 'ZeminRenk

        Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
            writer.AddAttribute("size", _boyut.ToString())
            writer.AddStyleAttribute("background-color", ZeminRenk)
            writer.RenderBeginTag("font")
            writer.Write(_metin)
            writer.RenderEndTag()
        End Sub 'Render
    End Class 'Baslik</pre>
<p><b>[Baslik.cs]</b></p>
<pre name="code" class="csharp">public class Baslik : Control
{
    . . .
    string _zeminRenk;

    //Fontun zemin rengi
    public string ZeminRenk
    {
        get
        {
            return _zeminRenk;
        }
        set
        {
            _zeminRenk = value;
        }
    }//ZeminRenk

    protected override void Render(HtmlTextWriter writer)
    {
        writer.AddAttribute("size", _boyut.ToString());
        writer.AddStyleAttribute("background-color", ZeminRenk);
        writer.RenderBeginTag("font");
        writer.Write(_metin);
        writer.RenderEndTag();
    }//Render
}//Baslik</pre>
<p>Kontrolü, bu haliyle tasarım anında sayfanın üzerine eklediğimizde küçük bir nokta olarak görülecektir. Property&#8217;lerini set etmeden mouse ile onu seçmek pek kolay olmayacaktır. Bunu aşmak için _metin değişkenine default bir değer verilebilir.</p>
<p>Private _metin As String = &#8220;Başlık giriniz!&#8221;<br />
private string _metin=&#8221;Başlık giriniz!&#8221;;</p>
<p>Böylece kontrol, sayfanın üzerine taşındığında Metin property&#8217;si &#8220;Başlık giriniz!&#8221; olarak set edilmiş olur.</p>
<p><b><u>PÜF</u></b><br />
TextBox gibi bazı kontrolleri, form elementi içerisinde kullakmak zorundayız. Eğer bu kontrolleri, form elementi dışında tanımlarsak &#8220;&#8230;must be placed inside a form tag with runat=server&#8221; hata mesajıyla karşılaşırız. Bu şekilde geliştirdiğimiz kontrollerin, &#8220;runat=server&#8221; özellikteki form elementinin içerisinde render edilmesini zorunlu kılmak için Page.VerifyRenderingInServerForm() metodu kullanılır. Custom kontrol, bu metoda parametre olarak geçilir. Bu işlemin, AddAttributesToRender() veya Render()/RenderContent() metodlarında yapılması tavsiye edilir.</p>
<pre name="code" class="vb">Protected Overrides Sub AddAttributesToRender(ByVal writer As HtmlTextWriter)
    Dim page As Page = Me.Page
    If (Not page Is Nothing) Then
        page.VerifyRenderingInServerForm(Me)
    End If
    . . .
End Sub</pre>
<pre name="code" class="csharp">protected override void AddAttributesToRender(HtmlTextWriter writer)
{
    Page page = this.Page;
    if (page != null)
    {
        page.VerifyRenderingInServerForm(this);
    }
    . . .
}</pre>
 
<span class = "" style = "height: 25px;  float: left; "><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.ahmetkaymaz.com/2008/05/11/web-kontrol-rendered-control/&layout=standard&send=false&show_faces=false&width=&action=like&colorscheme=light&font=" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:25px"></iframe></span>]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2008/05/11/web-kontrol-rendered-control/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Web Kontrol Geliştirme &#8211; II [Inherited Control , Deployment]</title>
		<link>http://www.ahmetkaymaz.com/2008/05/08/web-kontrol-inherited-control-ii/</link>
		<comments>http://www.ahmetkaymaz.com/2008/05/08/web-kontrol-inherited-control-ii/#comments</comments>
		<pubDate>Thu, 08 May 2008 12:32:02 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
				<category><![CDATA[C#, VB.NET, ASP.NET]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=265</guid>
		<description><![CDATA[Önceki bölümde özel web kontrol geliştirmeyle ilgili giriş yapmıştık. Bu bölümle birlikte kontrol geliştirme örneklerine geçeceğiz. İlk örnek olarak Inherited Control türündeki kontrolleri işleyeceğiz.
Inherited Control
.NET Framework ile birlikte gelen ve System.Web.UI.WebControls altında bulunan bir kontrolü taban alarak geliştirilen kontrollerdir. Bunu yapmamızın nedeni var olan kontrolü özelleştirmek veya ona yeni özellikler kazandırmaktır. Bu yönteme örnek olarak [...]]]></description>
			<content:encoded><![CDATA[<div class="google_plus_one"><g:plusone size="standard" count="true" url="http://www.ahmetkaymaz.com/2008/05/08/web-kontrol-inherited-control-ii/"></g:plusone></div><p>Önceki bölümde özel web kontrol geliştirmeyle ilgili giriş yapmıştık. Bu bölümle birlikte kontrol geliştirme örneklerine geçeceğiz. İlk örnek olarak Inherited Control türündeki kontrolleri işleyeceğiz.<span id="more-265"></span></p>
<p><b><u>Inherited Control</u></b><br />
.NET Framework ile birlikte gelen ve System.Web.UI.<b>WebControls</b> altında bulunan bir kontrolü taban alarak geliştirilen kontrollerdir. Bunu yapmamızın nedeni var olan kontrolü özelleştirmek veya ona yeni özellikler kazandırmaktır. Bu yönteme örnek olarak web sayfalarında kullanılan &#8220;hover button&#8221; kontrolünü hazırlayacağız. </p>
<p>Visual Studio içinde ismi OrnekWebKontrol olacak şekilde yeni bir Class Library projesi oluşturalım. Kendisinin oluşturduğu Class1 (Modul1 VB.NET) dosyasını silip yerine projeyi sağ tıklayıp &#8220;<b>Add » New Item</b>&#8221; bölümünden ismi HoverButton olan bir Class dosyası ekleyelim. Bu classı ImageButton&#8217;dan inherit edilecek şekilde düzenleyelim. HoverButton, mouse üzerine gelince zemin resmi veya rengi değişen butondur. Dolayısıyla burada kontrole ait tagın içeriğini oluşturmaktan ziyade (<i>ki bu içerik, ImageButton&#8217;dan gelecek</i>) oluşan elemente nitelik ekleyeceğiz. Bunun için override edilecek en uygun metod, <b>AddAttributesToRender()</b> metodudur. System.Web.UI.WebControls.<b>WebControl</b> üyesi olan bu metod, render edilmiş HTML elementine attribute ekleme aşamasını temsil eder. <b>AddAttributesToRender()</b> metodu, parametre olarak System.Web.UI.<b>HtmlTextWriter</b> türünde nesne alır. Bu bölümde yoğun kullanacağımız <b>HtmlTextWriter</b> nesnesi, ASP.NET server kontrollerinin istemciye gönderilecek içeriğine markup karakteri(&lt;/,/&gt;,&lt;,&gt; vb.) veya herhangi bir metin eklemek için kullanılır. Bu amaçla çoğu overload edilmiş geniş bir metod listesine sahiptir. Örneğin kontrole attribute eklemek için, <b>AddAttribute()</b> metodu kullanılır veya  doğrudan stream üzerine bir metin eklemek için nesnenin yapıcı yordamları kullanılır. Bu metodları daha sonra ele alacağız.</p>
<p>Projeye, &#8220;System.Web&#8221; kütüphanesini referans olarak eklemeyi unutmayalım. Özel bileşen geliştirirken çoğu System.ComponentModel kütüphanesinde bulunan tasarıma dayalı attributeler kullanılır. Bunları detaylı göreceğiz ama bu örnekte editörün &#8220;Properties&#8221; penceresinde bölümlendirme yapmak için Category isimli niteliği kullanacağız.</p>
<p><b>[HoverButton.vb]</b></p>
<pre name="code" class="vb">[HoverButton.vb]
Imports System.Web.UI 'HtmlTextWriter
Imports System.Web.UI.WebControls 'ImageButton
Imports System.ComponentModel 'Category niteliği

Namespace OrnekWebKontrol

'ImageButton'dan türetilsin
Public Class HoverButton : Inherits ImageButton
    'Butonun üzerine gelince çıkacak resim için değişken tanımlıyoruz.
    Private _hoverResim As String = ""

    'Bu yerel değişkenlerin Properties penceresinden ayarlanması için property tanımlayalım. Propertynin başında kullanılan Category niteliği bu propertynin görüneceği grubu tanımlar.
    &lt;Category("Hover Resmi")&gt; _
    Public Property HoverResim() As String
        Get
            Return Me._hoverResim
        End Get
        Set(ByVal value As String)
            Me._hoverResim = value
        End Set
    End Property

    Protected Overrides Sub AddAttributesToRender(ByVal writer As HtmlTextWriter)
        'Eğer kullanıcı HoverResim propertysine değer girmişse.
        If _hoverResim <> "" Then
            'JavaScript ile butonun üzerine gelindiğinde(onMouseOver) veya geri çekildiğinde(onMouseOut) butonun resmini değiştireceğiz.
            Me.Attributes.Add("onMouseOver", "this.src='" &#038; _hoverResim &#038; "'")
            Me.Attributes.Add("onMouseOut", "this.src='" &#038; MyBase.ImageUrl &#038; "'")
        End If
        MyBase.AddAttributesToRender(writer)
    End Sub
End Class

End Namespace</pre>
<p><b>[HoverButton.cs]</b></p>
<pre name="code" class="csharp">using System.Web.UI; //HtmlTextWriter
using System.Web.UI.WebControls; //ImageButton
using System.ComponentModel; //Category niteliği

namespace OrnekWebKontrol
{
//ImageButton'dan türetilsin
public class HoverButton : ImageButton
{
    //Butonun üzerine gelince çıkacak resim için değişken tanımlıyoruz.
    private string _hoverResim = "";

    /*
     Bu yerel değişkenlerin Properties penceresinden ayarlanması için property tanımlayalım. Propertynin başında kullanılan Category niteliği bu propertynin görüneceği grubu tanımlar.
     */
    [Category("Hover Resmi")]
    public string HoverResim
    {
        get
        {
            return this._hoverResim;
        }
        set
        {
            this._hoverResim = value;
        }
    }

    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
        //Eğer kullanıcı HoverResim property'sine değer girmişse.
        if (_hoverResim != "")
        {
            //JavaScript ile butonun üzerine gelindiğinde(onMouseOver) veya geri çekildiğinde(onMouseOut) butonun resmini değiştireceğiz.
            writer.AddAttribute("onMouseOver", "this.src='" + _hoverResim + "'");
            writer.AddAttribute("onMouseOut", "this.src='" + base.ImageUrl + "'");
        }
        base.AddAttributesToRender(writer);
    }//AddAttributesToRender

}//HoverButton

}//OrnekWebKontrol</pre>
<p>Böylece basit kişisel bir kontrol geliştirmiş olduk. Konuya detaylı devam etmeden önce kontrolleri, uygulamalarda nasıl kullanacağımızı öğrenmek için deployment konusundan bahsetmek faydalı olacaktır.</p>
<p><u><b>Custom Kontrol&#8217;ün deploy edilmesi</b></u></p>
<p>Geliştirdiğimiz custom kontrolleri web uygulamalarında kullanmak için kontrolü, uygulamaya referans olarak eklememiz gerekir. Eğer web projesi, custom kontrol projesiyle aynı solution içerisinde bulunuyorsa VS.NET 2005, custom kontrolü, otomatik olarak Toolbox&#8217;a ekler. Bu yöntem özellikle ayrıntılı kontrollerde bazen sorunlar çıkarsa da custom kontrolümüzü test etmek için en pratik yöntemdir. Bir custom kontrolü, deploy etmek için .dll dosyasının uygulamanın BIN klasörüne veya sunucunun GAC klasörüne kopyalayıp. Kontrolün Assembly&#8217;sini kullanılacak uygulamaya register etmeliyiz.</p>
<p>VS.NET 2005&#8242;te eğer aynı Solution içinde bir web projesi oluşturursak, projenin Toolbox&#8217;ında otomatik olarak HoverButton görünecektir. Başka bir Solution içindeki web projesinde bu kontrolü kullanmak için Toolbox&#8217;ı sağ tıklayıp &#8220;Choose Items&#8221; menüsünü kullanarak açılan pencerede &#8220;.NET Framework Components&#8221; sekmesinde &#8220;Browse&#8221; butonu kullanılır.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Web_Custom_Control_2.jpg"></p>
<p>Kontrolü, aspx sayfasında kullanılmak üzere sayfanın üzerine taşıdığımızda kontrolün .dll dosyası, uygulamanın BIN klasörüne kopyalanır ve HTML tarafında aşağıdaki gibi tag tanımlama satırları eklenir.</p>
<pre name="code" class="html"><%@ Register Assembly="OrnekWebKontrol" Namespace="OrnekWebKontrol" TagPrefix="cc1" %>
. . . . .
<form id="form1" runat="server">
    <cc1:HoverButton ID="HoverButton1" runat="server" />
</form>
</pre>
<p>VB.NET&#8217;te aşağıdaki gibi olur.</p>
<pre name="code" class="html"><%@ Register Assembly="OrnekWebKontrol"
Namespace="OrnekWebKontrol.OrnekWebKontrol" TagPrefix="cc1" %>
. . . . .
<form id="form1" runat="server">
    <cc1:HoverButton ID="HoverButton1" runat="server" />
</form>
</pre>
<p><font color="red">VB.NET&#8217;e özel olarak;</font><br />
<i>Namespace değerinde geçen OrnekWebKontrol ifadesinden birinci Assembly adı(Root Namespace) diğeri de içinde classı yazdığımız namespace&#8217;dir. Sadece birini yazmak için ya classı namespace&#8217;siz yazarız ya da projenin property&#8217;sinden Application sekmesinde &#8220;Root namespace&#8221; alanını boş geçeriz. Fakat &#8220;bir kontrolün namespace alanı boş olmamalı&#8221; kuralından dolayı custom kontrol uygulamalarında iki seçeneği de uygulayamayız.</i></p>
<p>Sayfaya eklenmiş ilk satır, kontrolün register işlemiyle ilgilidir. Bir kontrolü, sayfamızda kullanmak için o kontrolü öncelikle projeye register etmeliyiz. Yani projeyi, bu kontrol hakkında bilgilendirmemiz gerekir. Görüldüğü gibi <b>@ Register</b> belirtecinde kullanılacak kontrolün register edilmesi sağlanmıştır. Bu satırda kontrolün assembly bilgileri ve TagPrefix&#8217;i belirtilmiştir. Kontrolleri, kullanılacak her sayfada <b>@ Register</b> belirtecinde kayıt ettirmek zorundayız. Bu da zahmetli bir iş olduğu için buna alternatif olarak <b>Web.Config</b> kullanılabilir. Bir custom kontrolü, aşağıdaki yazımda gösterildiği gibi <b>Web.Config</b> dosyasında register edebiliriz.</p>
<p><b>[Web.Config]</b></p>
<pre name="code" class="html"><?xml version="1.0"?>
<configuration>
  <system.web>
<pages>
      <controls>
        <add tagPrefix="cc1"
             assembly=" OrnekWebKontrol"
             namespace="OrnekWebKontrol">
        </add>
      </controls>
    </pages>
  </system.web>
</configuration></pre>
<p>Custom kontrole ait Assembly, kullanıldığı projenin BIN klasöründe bulunmalıdır. Eğer custom kontrol, web server üzerinde bulunan tüm web uygulamaları tarafından erişilecekse, GAC&#8217;a eklememiz daha mantıklı olur.</p>
<p>Eğer custom kontrol, web uygulamasıyla aynı solution içerisinde değilse, kontrolün .dll dosyasını sürükle-bırak işlemiyle VS.NET&#8217;in Toolbox bölümüne taşıyarak ta kontrolü kullanabiliriz.</p>
<p>Kontrolün <b>ImageUrl</b> property&#8217;sine örnek bir resim yolu girip sayfayı kaydedelim. Sayfayı bu şekilde çağırdığımızda istemci tarafında generate edilecek HTML elementi aşağıdaki gibi olur. </p>
<pre name="code" class="html">
<input type="image"
    name="HoverButton1" id="HoverButton1"
    src="Resim1.gif" /></pre>
<p>Görüldüğü gibi sadece <b>ImageUrl</b> property&#8217;sini set ettiğimiz için <b>onMouseOver</b> ve <b>onMouseOut</b> nitelikleri boş tanımlandı. Dolayısıyla HoverButton kontrolü, kullanıcı HoverResim propertysine değer girildiği zaman anlamlı olacaktır yoksa normal bir ImageButton&#8217;dan bir farkı olmayacaktır. Eğer <b>HoverResim</b> property&#8217;sini set edersek çıktığı aşağıdaki gibi oluşur.</p>
<pre name="code" class="html">
<input onMouseOver="this.src='Resim1.gif'"
    onMouseOut="this.src='Resim2.gif '"
    type="image" name="HoverButton1" id="Image1"
    src="Resim1.gif" /></pre>
<p>Aynı işlemi <b>PreRender()</b> veya <b>Render()</b> metodlarında da yapabilirdik. Render() metodu, Web controlün, asıl render edildiği metoddur. Genellikle türetilmiş kontrollerde kontrol öncesi veya sonrası özel bir metin eklemek için kullanılır. Örneğin HoverButton kontrolünün bizim tarafımızdan yazıldığını HTML comment olarak istemci tarafında gönderelim. Class içinde <b>Render()</b> metodunu da override ederek aşağıdaki ifadeleri ekleyelim.</p>
<pre name="code" class="vb">Public Class HoverButton : Inherits ImageButton
    . . .
    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
        writer.Write("<!--HoverButon BAŞLA-->")
        MyBase.Render(writer)
        writer.Write("<!--HoverButon BİTİR-->")
    End Sub
End Class</pre>
<pre name="code" class="csharp">public class HoverButton : ImageButton
{
    . . .
    protected override void Render(HtmlTextWriter writer)
    {
        writer.Write("<!--HoverButon BAŞLA-->");
        base.Render(writer);
        writer.Write("<!--HoverButon BİTİR-->");
    }
}</pre>
<p>Bu eklemeden sonra, HoverButton, istemci tarafında aşağıdaki gibi görünecektir.</p>
<pre name="code" class="html"><!--HoverButon BAŞLA-->
<input type="image" name="HoverButton1" id="Image1" src="" />
<!--HoverButon BİTİR--></pre>
 
<span class = "" style = "height: 25px;  float: left; "><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.ahmetkaymaz.com/2008/05/08/web-kontrol-inherited-control-ii/&layout=standard&send=false&show_faces=false&width=&action=like&colorscheme=light&font=" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:25px"></iframe></span>]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2008/05/08/web-kontrol-inherited-control-ii/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Özel Web Kontrol Geliştirme (Custom Control) &#8211; I [Giriş]</title>
		<link>http://www.ahmetkaymaz.com/2008/05/07/web-kontrol-custom-control-gelistirme/</link>
		<comments>http://www.ahmetkaymaz.com/2008/05/07/web-kontrol-custom-control-gelistirme/#comments</comments>
		<pubDate>Wed, 07 May 2008 21:01:39 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
				<category><![CDATA[C#, VB.NET, ASP.NET]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=263</guid>
		<description><![CDATA[Component kavramı, yazılımın en küçük yapı birimini temsil eder. Bu kavram, 80&#8242;lı yılların sonunda uygulama geliştirme sürecinde uygulamayı bileşenlere ayırma ve gerektiğinde bu bileşenleri daha sonra yeniden yazılmaksızın diğer uygulamalarda kullanma ihtiyacından doğmuştur. Bunun sonucunda bileşen tabanlı yazılım geliştirme mimarisi ortaya çıkmıştır. Bu mimariyi desteklemek amacıyla Microsoft tarafında ActiveX, COM, Java tarafında Applet gibi teknolojiler [...]]]></description>
			<content:encoded><![CDATA[<div class="google_plus_one"><g:plusone size="standard" count="true" url="http://www.ahmetkaymaz.com/2008/05/07/web-kontrol-custom-control-gelistirme/"></g:plusone></div><p>Component kavramı, yazılımın en küçük yapı birimini temsil eder. Bu kavram, 80&#8242;lı yılların sonunda uygulama geliştirme sürecinde uygulamayı bileşenlere ayırma ve gerektiğinde bu bileşenleri daha sonra yeniden yazılmaksızın diğer uygulamalarda kullanma ihtiyacından doğmuştur. Bunun sonucunda bileşen tabanlı yazılım geliştirme mimarisi ortaya çıkmıştır. Bu mimariyi desteklemek amacıyla Microsoft tarafında ActiveX, COM, Java tarafında Applet gibi teknolojiler piyasaya sürülmüştür. Bu makalede bileşenlerin nasıl hazırlanacağı ve dağıtılacağını işleyeceğiz.<span id="more-263"></span></p>
<p>Yüzeysel bir tanım yapacak olursa, <b>Component</b>, herhangi bir user arabirimi olmayan, tasarım ortamını desteklemeyen ve başka nesnelerle etkileşimli olabilen bileşenlerdir. <b>Control</b> ise tasarım ortamıyla etkileşimli olan bileşenlerdir. .NET terminolojisinde <b>Component</b>, <i>System.ComponentModel.IComponent</i> arabiriminden türemiş olup desing-time nitelikleri olarak tanımlanan özel nitelikleri destekleyen yapılardır. Örneğin Timer bileşeni bir componenttir. <b>Control</b> ise Asp.Net <i>TextBox</i> gibi yine bir component türü olup user-interface yeteneğine sahip bileşenlerdir. Bu tanımlar sonucunda bütün kontroller, birer componenttir ama tersi doğru değildir diyebiliriz.</p>
<p>.NET Framework, client-side Windows Form Control (<i>System.Windows.Forms.Control</i>) ve ASP.NET Server Control (<i>System.Web.UI.Control</i>) olmak üzere iki tür kontrol kümesi sunar. .NET Framework&#8217;teki bütün kontroller dolaylı veya dolaysız bu iki kütüphaneden üretilmiştir. </p>
<p>ASP.NET Framework&#8217;ün en güçlü özelliklerinden biri de custom kontrol ve component geliştirmeye destek vermesidir. Sunduğu kütüphaneler aracılığıyla programcılar, kalabalık kodlar, detaylar arasında boğulmaktan kurtulmuştur. Kontrol geliştirmeyi kolaylaştırdığı gibi tasarım veya çalışma esnasında onları daha yetenekli kılmak ve toolboxa taşıyarak uygulamalarında bu kontrolleri kullanacak programcıların işlerini kolaylaştırmak için çeşitli ek bileşenler sunmaktadır. Bu bölümde ASP.NET Framework ortamında kendimize ait kontrolleri nasıl geliştireceğimizi veya varolan kontrolleri nasıl yönetebileceğimizi işleyeceğiz.</p>
<p>Özel bir web kontrolü geliştirmek için aşağıdaki sınıf türlerinden biri referans alınır;</p>
<ul>
<li>System.Web.UI.Control class</p>
<li>System.Web.UI.WebControls.WebControl class
<li>System.Web.UI.WebControls.CompositeControl class
<li>System.Web.UI.HtmlControls.HtmlControl class
<li>Var olan Asp.NET veya HTML server control</ul>
<p>Asp.NET platformunda bütün kontroller, doğrudan veya dolaylı olarak System.Web.UI.<b>Control</b> sınıfını taban alır. </p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Web_Custom_Control_1.jpg"></p>
<p>Bir custom server kontrol geliştirirken ya var olan bir kontrolden ya da <b>Control, WebControl, CompositeControl</b> veya <b>HtmlControl</b> sınıflarından inherit edilir. </p>
<ul>
<li><b>Control</b> sınıfı, tüm web kontrollerinin taban sınıfıdır. Kontrollerdeki standart üyeleri içerir. System.ComponentModel.<b>IComponent</b> arayüzünden inherit edilmiştir. Her iki kontrol türünün de, &#8220;sürükle bırak&#8221; özelliğini desteklemesi veya VS.NET içindeki properties penceresiyle etkileşimli çalışması <b>Control</b> sınıfından gelen bir özelliktir.</p>
<li><b>WebControl</b> sınıfı ise web controllerinin stil, renk ve font ayarları gibi görsel niteliklerini içerir. Aspx sayfalarında kullandığımız ve &#8220;&lt;asp:&#8230;&#8221; önekle başlayan temel kontroller bu sınıftan türemişlerdir.
<li><b>CompositeControl</b> sınıfı, .NET 2.0 ile birlikte gelmiş yeni bir sınıf olup, birden fazla kontrol(child control) içeren bileşik kontrol geliştirmek için kullanılır.
<li><b>HtmlControl</b> sınıfı, HTML server kontrolleri için ortak olan metod, property ve eventleri kapsar.
<li><b>TemplateControl</b> sınıfı, data-bound(<i>GridView,DataList . . .</i>), page control(Asp.NET sayfaları) ve templated kontrol gibi zengin kontrollerin taban sınıfıdır. Ayrınca Microsoft&#8217;un user control olarak isimlendirdiği ve bir çok .aspx sayfası tarafından ortak kullanılan kontroller de bu classtan türemiştir(<i>.ascx dosyaları</i>). Bu kontrolleri ASP&#8217;deki include dosyaları gibi düşünebiliriz.</ul>
<p>Daha önceden var olan bir kontrolü taban alarak gerçekleştirilen kontrollere <b>Inherited Control</b> denilir. Doğrudan <b>Control</b> veya <b>WebControl</b> sınıflarından türemiş kontrollere <b>Custom Rendered Control</b> denilir. <b>CompositeControl</b> sınıfından türetilmiş kontrollere <b>Composite Control</b> denilir. <b>TemplateControl</b> sınıfından türemiş kontrollere de <b>Templated Control</b> denilir.</p>
<p>Eğer bir user interface(UI) veya başka görsel bir element geliştirilecekse bunun için <b>WebControl</b> veya bundan türetilmiş sınıfların kullanılması tavsiye edilir. Eğer HTML <i>hidden</i> veya <i>meta tag</i> gibi görsel olmayan(non-visual elements) basit bir element geliştirilecekse <b>Control</b> sınıfının taban alınması daha doğru olur.</p>
<p>Web tabanlı özel kontrol geliştirirken request-response sürecindeki yol haritasını, Asp.NET yaşam döngüsünü bilmek gerekir. Asp.NET&#8217;in sayfa yaşam döngüsünde her request işleminde page nesnesi ve içindeki kontroller yeniden oluşturulur ve işlem sonucunda yok edilir. Bilindiği gibi bu oluşma-yok olma sürecinde bazı evre ve olaylar gerçekleşir. Bu evre ve olaylar, kontrollerin de yaşam döngüsüyle ilintili olduğu için konunun detaylarına girmeden önce Asp.NET yaşam döngüsünü hatırlayacak kadar burada özetlememiz faydalı olacaktır. Aşağıdaki tabloda sayfa ve kontrol bazlı yaşanan evreler gösterilmiştir.</p>
<table class="gritable" width="100%" align="center">
<tr>
<th>Aşama</th>
<th>Açıklama</th>
</tr>
<tr>
<td>Page request</td>
<td>Page life cycle başlamadan önce bu aşama çalışır. Sayfa bir kullanıcı tarafından istendiği zaman Asp.NET, bu sayfanın parse ve compile edilip edilmeyeceğine veya sayfayı çalıştırmadan varsa cachedeki versiyonunu gönderip göndermeyeceğine karar verir.</td>
</tr>
<tr>
<td>Start</td>
<td>Yaşam döngüsünün ilk adımını temsil eden bu süreçte <b>page</b> nesnesinin <b>Request</b> ve <b>Response</b> gibi property&#8217;leri set edilir. Ayrıca <b>page</b> nesnesi, gönderilen requestin bir Postback sonucu mu yoksa yeni bir request olarak gelip gelmediğini belirler ve ona göre <b>IsPostBack</b> property&#8217;sini set eder. <b>IsPostBack</b>, sayfanın Postback modunu bildirir. Bu aşamada ek olarak sayfanın <b>UICulture</b> propertysi de set edilir.</td>
</tr>
<tr>
<td>Page initialization</td>
<td>Sayfanın oluşturulma aşamasında sayfa üzerindeki kontroller, erişilebilir duruma gelir ve her kontrolün <b>UniqueID</b> propertysi set edilir. Eğer o anki request, bir Postback sonucu gerçekleşmişse bu aşamada Postback data henüz yüklenmemiş ve kontrollerin değeri Viewstate&#8217;e göre yenilenmemiştir.</td>
</tr>
<tr>
<td>Load</td>
<td>Load aşamasında eğer geçerli request bir postback ise kontrollerin değeri ve durumu Viewstate içeriğine göre şekillenir.</td>
</tr>
<tr>
<td>Validation</td>
<td>Varsa sayfa üzerindeki validator kontrollerin <b>Validate()</b> metodu çağrılır. <b>Validate()</b> metodu, page nesnesi ve içindeki kontrollerin her birinin <b>IsValid</b> property&#8217;sini set eder. Hatırlanacağı gibi <b>IsValid</b> property&#8217;si, kontrolün doğrulama işleminin başarılı olup olmadığını bildirir.</td>
</tr>
<tr>
<td>Postback event handling</td>
<td>Eğer request bir Postback sonucu gerçekleşmişse, Postback&#8217;i gerçekleştirmiş veya durumu değişmiş kontrollerin ilgili eventleri tetiklenir.</td>
</tr>
<tr>
<td>Rendering</td>
<td>Render işleminden önce page ve kontroller için Viewstate nesnesi kaydedilir. Render aşamasında page nesnesi, her kontrolün <b>Render()</b> metodunu çalıştırır. <b>Render()</b> metodu, <b>text writer</b> nesnesini kullanarak kontrolün outputunu page&#8217;in <b>Response</b> propertysine ait <b>OutputStream</b>&#8216;e (HTTP ile gidecek olan binary içerik) yazar.</td>
</tr>
<tr>
<td>Unload</td>
<td>Unload evresi, sayfa tümüyle render edildikten ve istemciye gönderildikten sonra çağrılır. Bu durumda sayfa, artık hafızan kaldırılmaya (discard) hazırdır. Unload aşamasında, <b>Request</b> ve <b>Response</b> nesneleri temizlenmiş olur.</td>
</tr>
</table>
<p>Döngünün bu evrelerinde zamanı geldikçe ilgili event ve metodlar otomatik olarak tetiklenir. Bunları da şu şekilde özetleyebiliriz;<br />
<u><b>1.Page_PreInit</b></u><br />
IsPostBack property&#8217;si okunup sayfanın ilk defa process edilip edilmediği öğrenilebilir. Dinamik kontrollerin oluşturulması, <b>master page</b>&#8216;in programatik olarak uygulanması, <b>theme</b> propertysinin dinamik olarak set edilmesi bu metod içinde yapılır. Ayrıca bu metod içinde <b>profile</b> property&#8217;si okunabilir veya set edilebilir.<br />
<u><b>2.Page.Init + Control.Init</b></u><br />
Döngünün ilk aşaması olan <b>Initialization</b> evresinde sayfaya ait control tree, tanımlı kontrollerle şekillenir ve önce page nesnesine ait <b>Init</b> eventi daha sonra her kontrolün ayrı <b>Init</b> eventi tetiklenir. Viewstate bilgisi henüz yüklenmemiştir.<br />
<u><b>3.Page.LoadViewState</b></u><br />
Initialization aşamasından sonra ASP.NET, sayfanın Viewstate&#8217;ini yükler. Viewstate, sayfanın sunucuda en son process edilmiş durumunu içerir.<br />
<u><b>4.Page.ProcessPostData</b></u><br />
Request ile birlikte gelmiş Postback data okunur ve ilgili kontrollere yüklenir<br />
<u><b>5.Page.Load + Control.Load</b></u><br />
Sayfa üzerindeki kontroller, tümüyle yüklendikten sonra Load eventleri tetiklenir. Bu metoda, genellikle sayfa ilk defa çağrıldığı(Postback edilmediği) zaman yapılacak data binding işlemleri yazılır.<br />
<u><b>6.&#8221;Change&#8221; Events</b></u><br />
Kontrollerin yeni değerleri(Postback) ile orijinal değerleri(Viewstate) karşılaştırılır ve durumu değişmiş kontrollerin ilgili eventleri tetiklenir.(<i>TextChanged, SelectedIndexChanged &#8230;</i>)<br />
<u><b>7.Validate</b></u><br />
Sayfa üzerindeki validatorlerin server side eventleri tetiklenir. Böylece doğrulama işlemi sadece istemci tarafına bırakılmamış olur.<br />
<u><b>8.&#8221;Postback&#8221; Events</b></u><br />
Postback işlemine neden olmuş kontrollerin eventleri çalışır. Örneğin bir buton tıklandığı zaman yapılacak işlemleri bu aşamada <i>Button.Click, Button.Command</i> gibi metodlarda bildiririz.<br />
<u><b>9.Page.PreRender + Control.PreRender</b></u><br />
Sayfa render edilmeden ve Viewstate kayıt edilmeden önce yapılacak işlemler bu metodlarda yazılabilir. Özellikle kontroller üzerinde yapılacak son değişiklikler bu aşamada yapılır.<br />
<u><b>10.Page.SaveViewState</b></u><br />
Kontrollerin yeni değerleri ve sayfanın durumu sunucuya yapılacak bir sonraki dönüşte hatırlansın diye Viewstate nesnesine kayıt edilir.<br />
<u><b>11.Page.Render</b></u><br />
<u><b>12.Page_Unload</b></u><br />
Temizlik işlemlerinin yapıldığı bu evrede sayfa istemciye gönderilmiştir. Bu metodu açık kalmış dosya ve database bağlantıları kapatmak veya request-response ile ilgili loglama yapmak gibi işlemler için kullanılabilir.</p>
 
<span class = "" style = "height: 25px;  float: left; "><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.ahmetkaymaz.com/2008/05/07/web-kontrol-custom-control-gelistirme/&layout=standard&send=false&show_faces=false&width=&action=like&colorscheme=light&font=" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:25px"></iframe></span>]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2008/05/07/web-kontrol-custom-control-gelistirme/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Yeni Nesil Veri Programlama Modeli (ADO.NET 3.5)</title>
		<link>http://www.ahmetkaymaz.com/2008/02/28/orm-linq-object-relational-mapping-adonet-entity-framework/</link>
		<comments>http://www.ahmetkaymaz.com/2008/02/28/orm-linq-object-relational-mapping-adonet-entity-framework/#comments</comments>
		<pubDate>Thu, 28 Feb 2008 07:07:31 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
				<category><![CDATA[C#, VB.NET, ASP.NET]]></category>
		<category><![CDATA[ADO.NET Entity Framework]]></category>
		<category><![CDATA[Object Relational Mapping]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=233</guid>
		<description><![CDATA[Microsoft firması .NET Framework 3.0 ile birlikte ADO.NET&#8217;in yeni bir versiyonunu yayınlamadı. .NET Framework 3.5 ile birlikte yeni eklentiler kazandırılmış ADO.NET 3.5 sürümü yayınlandı.
Microsoft, ADO.NET 3.5 sürümleriyle birlikte veritabanı uygulama mimarisinde büyük kolaylık sağlayan Object Relational Mapping (O/R Mapping) yöntemini destekleyecek önemli adımlar attı. Bu amaçla ADO.NET Entity Framework aracı geliştirildi. Konunun ayrıntılarına geçmeden önce [...]]]></description>
			<content:encoded><![CDATA[<div class="google_plus_one"><g:plusone size="standard" count="true" url="http://www.ahmetkaymaz.com/2008/02/28/orm-linq-object-relational-mapping-adonet-entity-framework/"></g:plusone></div><p>Microsoft firması .NET Framework 3.0 ile birlikte ADO.NET&#8217;in yeni bir versiyonunu yayınlamadı. .NET Framework 3.5 ile birlikte yeni eklentiler kazandırılmış ADO.NET 3.5 sürümü yayınlandı.<br />
Microsoft, ADO.NET 3.5 sürümleriyle birlikte veritabanı uygulama mimarisinde büyük kolaylık sağlayan <b>Object Relational Mapping (O/R Mapping)</b> yöntemini destekleyecek önemli adımlar attı. Bu amaçla <b>ADO.NET Entity Framework</b> aracı geliştirildi. Konunun ayrıntılarına geçmeden önce bu kavramları tanımlayalım ve neden yeni bir yaklaşıma ihtiyaç duyulduğunu açıklayalım.<span id="more-233"></span></p>
<p>Günümüzde özellikle veritabanına dayalı uygulamalar, katmanlı mimari (multi-tier architecture) üzerine kurulur. Bu konsept dahilinde uygulamalar, <b>veri (data)</b>, <b>iş (business logic)</b> ve <b>sunum (presentation)</b> olmak üç temel katmandan oluşur. Tasarım sürecinde ilk sırada bulunan veri katmanı oluşturulurken çeşitli veri modelleri kullanılır. &#8220;<i>Verileri mantıksal düzeyde düzenlemek için kullanılan kavramlar, yapılar ve işlemler bütününe <b>veri modeli</b> denir.</i>&#8221;<br />
70&#8242;lı yıllardan bu yana Veritabanı Yönetim Sistemleri&#8217;nin (Database Management System – DBMS [VTYS]) değişmesiyle birlikte çeşitli veri modelleri geliştirildi:</p>
<ul>
<li>Sıradüzensel veri modeli (Hierarchical data model)
<li>Ağ veri modeli (Network data model)
<li>İlişkisel veri modeli (Relational data model)
<li>Nesneye yönelik veri modeli (Object oriented data model)
</ul>
<p>Her VTYS&#8217;nin kendine özgü veri modeli bulunur. Veri modeli kullanılarak veritabanının kavramsal ve dış şemaları oluşturulur. Burada bu modellerle ilgili kavramları tanımlayacağız ve VTYS&#8217;den bağımsız tasarım yapmamızı sağlayan ER modelini ayrıntılı ele elacağız. </p>
<p><u><b>Entity Relationship (ER) Modeling</b></u></p>
<p>Günümüzde bir veritabanı uygulamasının başarılı olmasını sağlayacak ilk parametre, iyi bir veritabanı tasarımına sahip olmasıdır. Bir uygulama geliştirileceği zaman öncelikle bu uygulamanın ne tür bir uygulama olduğu ve ne tür verileri içereceği belirlenir. Veritabanı tasarımı, bu soruların yanıtları doğrultusunda şekillenir. İlişkisel veritabanı sistemlerinde veritabanı tasarımının ilk adımı veri modellemedir.<br />
Veri modelleme, veritabanı verilerinin ve bunların arasındaki ilişkinin organizasyon içindeki herkesin rahatlıkla anlayabileceği metin ve şekillerle ifade edilmesidir. Bilindiği gibi organizasyon içindeki <i>kullanıcı</i>, <i>tasarımcı</i> ve <i>programcı</i> gibi teknik veya teknik olmayan kişilerin veriye bakış açıları ve veriyi tanımlamaları farklılık arzeder. Hazırlanacak olan veritabanı tasarımında bu kişilerin hepsinin rolü olduğu için bu kişiler arasında ortak bir dil oluşturmak gerekir. Bu dilin temeli hiç şüphesiz gerçek dünya varlıklarıdır. Veritabanını kullanacak olan kullanıcı, tasarlayacak olan tasarımcı ve kodlayacak programcı ihtiyacını ancak gerçek varlıklar (nesneler) üzerinden daha kolay anlatabilir. Fakat gerçek dünyada varlıklar daha karmaşık özellik ve yeteneklere sahip olduğu için bu varlıklar üzerinden ifade edilmiş yapıyı, veri modellemesi aracılığıyla daha anlaşılır hale getirmek gerekir. Buradaki amaç, organizasyon içindeki herkesin gördüğü zaman kolaylıkla anlayabileceği ve veritabanı yapısını gözünde canlandırabileceği bir veri modeli çıkarmak ve bu model üzerinden organizasyon ihtiyaçlarını doğru şekilde karşılayacak fiziksel bir veritabanı tasarımına zemin hazırlamaktır.<br />
Veritabanı modellemenin üç türü vardır. Bu türler aynı zamanda veritabanı model veya tasarımın aşamalarını da bildirir.</p>
<p><b>Kavramsal tasarım (Conceptual design):</b> Veri tabanının hangi verileri içereceğinin ve bu veriler arasındaki ilişkilerin belirlendiği aşamadır. Bu aşamanın en önemli özelliği veritabanı nesneleri herhangi bir VTYS şemasına bağlı kalınmadan modellenir. Bu aşamada organizasyon içindeki herkes aktif olabilir. Kavramsal modelleme, mantıksal modellemenin çözümlenmesini ve tasarımını kolaylaştırmak için atılmış bir adımdır.</p>
<p><b>Mantıksal tasarım (Logical design):</b> VTYS&#8217;nin tanımlandığı aşamadır. Kavramsal tasarımda modellenen yapı, karar verilmiş olan VTYS&#8217;ye uygun şemaya dönüştürülür. Veritabanında kullanılacak veri türleri, tablo üzerindeki anahlarlar, tablo satırlarının birbirleriyle ilişkileri bu aşamada belirlenir. Bu aşamada daha çok tasarımcı ve programcı rol oynar.</p>
<p><b>Fiziksel tasarım (Physical design):</b> Verilerin hangi disk veya başka fiziksel depolama sistemlerinde nasıl tutulacağı, ne tür işlemci yapılarının kullanılacağı, aygıtların verilere hangi yol ve kurallar dahilinde ulaşacağı ve bunların doğrultusunda VTYS yazılımın hangi işletim sistemi üzerinde koşacağı belirlenir. Daha çok veritabanı programcısının aktif rol oynadığı bu aşamada oraya çıkan modelin daha önce organizasyon elemanlarıyla birlikte karar verilmiş olan kavramsal ve mantıksal modelle olan uyumluluğu test edilir. Kısaca, kavramsal ve mantıksal tasarım aşamasında, veritabanı şemasına karar verildiğini, fiziksel tasarım aşamasında da veritabanının fiziksel yapısına karar verildiğini söyleyebiliriz. </p>
<p>Bu aşamalardan sonraki süreç, uygulama programının yazılarak kullanıcıların belirlenmiş yetkiler ölçüsünde veriye ulaşmasıdır.</p>
<p>Kendisi soyut bir yapı olan veri modeli, ANSI-SPARC mimarisine göre <b>kavramsal (conceptual)</b>, <b>dış (external)</b> ve <b>iç (internal)</b> olmak üzere üç seviyeli soyutlama derecesine sahiptir. Bu seviyeler, veri ortamının organizasyon içindeki kişiler tarafından görünen görünümü temsil eder. <b>Dış seviye</b>, veritabanının kullanıcıya olan görüntüsü ifade eder. Her kullanıcının özgül bakışı ve bilgisi doğrultusunda birçok dış görünüm oluşturulabilir. Bu görünümler kullanıcı programları veya doğrudan SQL cümleleriyle oluşturulur. Daha çok veritabanı sahiplerinin hazırladığı ve veritabanının üst düzeyde soyutlanmış hali olan <b>kavramsal seviye</b>, veritabanının kuş bakışı görüntüsünü temsil eder. Bu seviyede veritabanında hangi verilerin saklandığı ve bu veriler arasındaki ilişki görünür. Kavramsal modelde veritabanı yazılım ve donanımla ilgili bilgi bulunmaz yani VTYS&#8217;den bağımsız bir görüntü sunar. <b>İç seviye</b> ise VTYS&#8217;ye bağımlı olup veritabanının VTYS&#8217;ye göre hazırlanmış şemasını belirtir. Veritabanının en alt düzeyde soyutlanmış olan bu seviyede verilerin veritabanın nasıl saklandığı ifade edilir. Aynı zamanda fiziksel seviye olarak ta bilinir.</p>
<p>Veritabanı tasarımı konusunda bu kadar giriş yapmamız yeterli olacaktır. Asıl konumuz; kavramsal tasarım aşamasında en çok kullanılan yöntem olan <b>Varlık-İlişki (Entity-Relationship, ER)</b> modelidir. ER modeli, kavramsal veri modelini herhangi bir VTYS şemasına bağlı kalmadan ana hatlarıyla ER diyagramı üzerinde şematik olarak gösterme tekniğidir. Bu teknik, organizasyon içerisindeki teknik veya teknik olmayan kişiler arasında verinin farklı görünümlerini ortak bir kalıba dönüştürür ve veritabanı uygulamalarının daha kolay geliştirilmesini sağlar. ER çizenekleri için, genellikle UML gösterimleri kullanılır. </p>
<p>ER yönteminin çıkış amacı tasarımcıların oluşturduğu nesne modelini, nesne kavramını anlamayan ilişkisel veritabanı yönetim sistemlerine kolaylıkla uyarlayabilmektir.<br />
ER modeli, teknik olarak <b>varlıklar (entities)</b> ve <b>ilişkiler (relationships)</b> koleksiyonundan oluşur. ER modelinin temelinde bu bölümün de anahtar kelimesi olan <b>varlık</b> bileşeni bulunur. Varlık ifadesi, Yazılım Mühendisliği literatüründe gerçek dünyadaki anlamıyla kullanılır. Yani soyut veya somut olarak var olan ve benzerlerinden ayırt edilebilen her şeye varlık denilir. Örneğin gerçek dünyada <i>insanoğlu</i>, <i>araba</i>, <i>devlet</i> nesneleri varlık olarak nitelendirildiği gibi nesne tabanlı programlamada sınıflar, veritabanı yönetim sisteminde de tablolar varlık olarak nitelendirilir. Her varlık, kendisini diğer varlıklardan ayırteden <b>öznitelik (attribute)</b> olarak bilinen karakteristiklere sahiptir. Veritabanındaki tablolar, satır ve sütunlardan oluşur. Tablo satırlarının her biri bir tek varlığı temsil eder. Varlığın her bir niteliği bir sütunda temsil edilir. Örneğin bir elektronik ticaret projesinde &#8220;Musteri&#8221; bir varlık, müşterinin &#8220;AdSoyad&#8221; bilgisi, bu varlığa ait bir nitelik olarak tanımlanabilir. &#8220;AdSoyad&#8221; bilgisinin &#8220;Murat Şensoy&#8221; olarak belirlenmesi bu niteliğin değeridir (<b>data value</b>). Özniteliğin alabileceği veya aldığı değerler <b>etki alanı (domain)</b> olarak tanımlanır.</p>
<p>VTYS&#8217;ler varlık kümesi ve onların arasındaki etkileşimden oluşur. Varlıklar arasındaki etkileşim, varlık ilişkisi olarak tanımlanır. Varlıklar arasında üç tür ilişki kurulur:</p>
<p><b>Birden çoğa ilişki (one-to-many relationship):</b> Bir tablonun bir kaydına karşılık ikinci tabloda birden fazla kaydın olmasıdır. &#8220;Siparis&#8221; ve &#8220;Musteri&#8221; tabloları arasındaki ilişkidir. Bir sipariş, sadece bir müşteriye ait olabilir fakat bir müşterinin birden fazla siparişi olabilir. Bu ilişki 1:M ile temsil edilir.</p>
<p><b>Çoktan çoğa ilişki (many-to-many relationship):</b> Bir tablonun birden fazla kaydı, diğer tablonun birden fazla kaydıyla ilişkilidir. M:N ile temsil edilen bu ilişki genellikle üçüncü bir tablo üzerinde oluşturulur. &#8220;Ogrenci&#8221; ve &#8220;Kurs&#8221; tablolarını örnek olarak verebiliriz. Bir öğrenci birden fazla kursa katılabilir aynı şekilde bir kursa birden fazla öğrenci katılabilir. Bu ilişki &#8220;OgrenciKurs&#8221; tablosunda tutulur.</p>
<p><b>Birden bire ilişki (one-to-one relationship):</b> Bir müşterinin bir şifresi var ve her bir şifre bir müşteriye aittir. Bu durum, bir tablo ilişkisinden ziyade ikinci tablonun birinci tablonun uzantısı olmasıdır.</p>
<p>Tasarım aşamasında varlık ve onlara ait öznitelikler belirlendikten sonra varlıklar arasındaki ilişkiler belirlenir ve öğe ilişki çizeneği çıkarılır (<i>entity relationship diagramming &#8211;  öğe ilişki çizeneği</i>). Bu çizelgede veritabanı varlıkları, varlıkların türleri, varlıklar arası ilişkiler ve ilişki kuralları gösterilir. ER diyagramı hazırlayabilmek için <i>Microsoft Visio, Sybase Power Designer</i> gibi araçlar kullanılır. Aşağıdaki çizelgede üç tablonun yapısı ve ilişkileri gösterilmiştir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/ER_Model_1.jpg"></p>
<p>Sonuç olarak ER tekniğinin, veritabanı oluşturulmadan önce veritabanı tasarımını kolaylaştırmak amacıyla veritabanının hangi varlıklardan oluştuğunu ve bu varlıkların nasıl ilişkilendirildiğini çeşitli şemalarla belirtme yöntemi olduğunu söyleyebiliriz. ER modelinin en önemli özelliği bu mantıksal tasarımı VTYS şemasına bağlı kalınmadan yapmasıdır. </p>
<p>VTYS tarafında, tasarımcılar tarafından oluşturulmuş olan nesne modelini VTYS&#8217;de saklamak için aracı olarak ER modelini kullanıyoruz. Bu ek işlem, şu anki VTYS&#8217;lerin nesne yönelimli (Object Oriented) olmamasından kaynaklanmaktadır. Aynı sorun kullanıcılarla veritabanı arasında iletişim sağlayacak veritabanı uygulamaları yazılırken de yaşanır. Özellikle nesne yönelimli bir programlama dili kullanıldığı zaman class, inheritance, property, method gibi OOP varlıkları VTYS tarafından desteklenmediği için iş katmanında OOP ve ilişkisel veritabanı özellikleri iç içe kullanılır. Uygulamaların iş katmanındaki bu iş yükünü azaltmak amacıyla <b>O/R Mapping</b> isimli nesne-ilişki eşleştirme yöntemi kullanılır.</p>
<p><b><u>Nesne-İlişkili Haritalama (Object-Relational Mapping &#8211; O/R Mapping)</u></b></p>
<p>Günümüzde en çok kullanılan veri modeli, ilişkisel veri modelidir. Aynı şekilde uygulamaların iş katmanı yazılırken en çok nesne odaklı programlama modeli tercih edilir. Uzun yıllardır kullanılan bu iki yöntem, uygulama geliştiriciler için ciddi kolaylıklar sağlamıştır. Bununla birlikte bu iki yöntemin kullanıldığı geniş çaplı kurumsal uygulamaların en önemli sorunu, bu uygulamaların tasarım ve geliştirme süreçlerinin yönetimi zor ve zaman alıcı bir hal almasıdır. Özellikle iş katmanında veritabanı sorgulama işlemlerinde yoğun bir şekilde SQL dilinin kullanılıyor olması ve uygulama kodlarının veritabanı şemasına bağlı kalması, uygulama geliştiricilerinin veritabanı tarafında çok zamanını almaktadır. Veritabanında yeni bir kolon ekleme, kolon değiştirme gibi tablonun şemasının değişmesi durumunda uygulamanın iş katmanındaki veri erişim kodlarının yeniden gözden geçirilmesi gerekir. Bir veritabanı uygulamasında, kodun üçte birinin veri erişimiyle ilgili olduğunu göz önünde bulundurduğumuzda veri erişim katmanında her modül için <i>sorgulama, ekleme, güncelleme, silme</i> gibi işlemleri yeniden kodlamak birçok yazılım mühendisi için sıkıcı ve zaman alıcı olabilmektedir. </p>
<p>Ayrıca iş katmanında nesne odaklı programlama tercih edildiği halde veriye nesnesel olmayan yöntemlerle erişilir. Yani veritabanında veri tutmaya yarayan tabloları, uygulama geliştirme tarafında gerçek varlıkları temsil etmek için kullandığımız nesnelerle ifade edememekteyiz. Aynı şekilde uygulama tarafında oluşturulmuş bir nesneyi de veritabanı tarafında uygun bir şekilde temsil edememekteyiz. Bu işlemleri yapabilmek için diğer veri modeli olan ve gerçek dünyayı daha iyi modelleyebilecek &#8220;nesneye yönelik veri modeli&#8221;nin gelişmiş olması lazım. Şu ana kadar bu modeli desteklemek amacıyla Nesne Yönelimli VTYS (Object Oriented DBMS &#8211; OODBMS) üzerinde çalışmalar yapılmışsa da ciddi sonuçlar elde edilemedi. Bu yüzden sözkonusu sorunları aşmak için şimdilik yapabileceğimiz ancak yöntemin iyileştirilmesi olacaktır. Bu amaçla ilişkisel veritabanı ile nesneler arasında bağlantı kurma ve eşleştirme yapma yöntemi olarak bilinen <b>Nesne/İlişkisel Eşleme (O/R Mapping-ORM)</b> modeli kullanılır. Bu model, uygulamaların iş katmanında kod yazımını kısaltarak veritabanı işlemlerinin daha kısa sürede geliştirilmesini, veritabanı işlemlerinde OOP yeteneklerinin kullanılmasını sağlar ve sonuçta yazılım bakımını kolaylaştırır. Bu cümleleri biraz daha detaylandıralım.</p>
<p>ORM yöntemi, en çok tercih ettiğimiz nesne odaklı programlama modeli ile ilişkisel veritabanı modeli arasında ilişki kurup ilişkisel veritabanındaki öğelerin, nesne odaklı dildeki nesnelere nasıl karşılık geleceğini yönetir. Tabloları sınıflara (class), satırları nesnelere (instance), kolonları bu nesnelerin özniteliklerine (attribute) bağlar, oluşturulan sınıf yordamları, tablo seviyesinde, nesne yordamları da satır seviyesinde işlemler yapmak için kullanılır. Böylece verileri sorgularken, güncellerken, eklerken, silerken nesnesel ifadeler kullanmamıza olanak tanır. VTYS tarafındaki öğelere karşılık gelen uygulama nesnelerine <b>alan nesnesi (domain object)</b> denilir. Bu kalıcı sınıflar, uygulama tarafında, <b>veri erişim katmanı (persistence layer)</b> olarak isimlendirilen alanda yaşar.</p>
<p>Bir anlamda uygulamayı, veritabanından soyutlamış olan ORM yaklaşımı, veri işleme katmanını daha hızlı oluşturmamızı, veritabanı işlemlerinde daha az SQL kodu yazmamızı ama bununla birlikte verileri en az SQL kadar güçlü bir yöntemle sorgulamamızı ve performans açısından otomatik ön bellekleme yapılmasını sağlar. Ayrıca veritabanı şemasında yapılan bir değişiklikte (<i>veri erişim katmanındaki sınıflar doğrudan veritabanına bağlı olmadığı için</i>) veri erişim kodlarını gözden geçirmek yerine daha önce oluşturulmuş olan xml tabanlı nesne-tablo eşleştirme dosyasının düzenlenmesi yeterli olacaktır. </p>
<p>O/R Mapping yönteminde kullanılmak üzere birçok araç geliştirilmiştir bunların en popüleri ilk olarak Java platformu için çıkarılmış ama daha sonra .NET sürümü de geliştirilmiş olan açık kaynak <b>NHibernate</b> ürünüdür (<a href="http://www.hibernate.org" target="_blank">www.hibernate.org</a>). Bunun dışında başta <b>LLBLGen</b> ürünü olmak üzere .NET platformunda kullanılacak birçok O/R Mapping aracı bulunmaktadır. Günümüzde birçok yazılım evi, uygulamalara ait ORM kodu üreten framework&#8217;ler geliştirmiştir. Bu araçlar kullanılarak sorgulama cümleleri elle yazılmak yerine otomatik olarak üretilir ve veri erişim katmanı kısa sürede oluşturulmuş olur. Dolayısıyla yazılım mühendisinin veri erişim ve sorgulama için ayıracağı kodlama zamanını iş katmanındaki algoritmaya ayırması, o alana odaklanması, veri erişim katmanını düşünmemesi sağlanmış olur.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/ER_Model_2.jpg"></p>
<p>Bir diğer konu da ugulamalar içerisinde veritabanı işlemleriyle ilgili kodların çalıştırılma yönteminin ne olacağıdır. Bu yöntemin ne olacağı yazılım uzmanları arasında birçok tartışma konusu olmuştur. .NET Framework&#8217;ün ilk sürümlerinde iş katmanında dinamik SQL yerine SQL yordamlarının (stored procedure) kullanılması tavsiye edilmiştir. Bu yöntemin daha fazla güvenlik ve hız kazandırdığı dile getirildi. Ancak günümüzde bu yöntemin güvenli olduğu kabul edilse de performans ve kullanım konusunda fikir birliği sağlanamamıştır. Stored procedure yerine dinamik SQL kullanılmasını tavsiye edenlerin dayanağı; stored procedure&#8217;lerin versiyonlama, taşınma ve kurulumun kolay olmaması ve büyük ölçekli kurumsal uygulamalarda iş kurallarının genişlemesiyle birlikte yönetimi ve bakımı zorlaşacak çok sayıda procedure yazmak zorunda kalınmasıdır. Aslında asıl sorun iş katmanı ve veri katmanı sınırlarının iç içe geçmesi ve ilk paragraflarda bahsettiğimiz gibi uygulama geliştiricinin veri katmanında çok zaman harcamasıdır. Veritabanının doğası gereği görevi veri arama, tarama olduğu için kod güvenliği, matematiksel işlemler, koşula dayalı işlemler gibi ek faaliyetlerle uğraşmaması gerekir. Bununla birlikte farklı türden veritabanı üzerinde çalışma ihtimali olan paket haline getirilecek bir ürün için iş kurallarını stored procedure üzerinde oluşturmak uyarlama sürecini zorlaştıracak, zaman kaybına neden olacaktır. Stored procedure&#8217;lere alternatif olarak dinamik SQL yapısının kullanılması da uygulamayı, veritabanı şemasına bağımlı hale getirecektir. Bu yüzden O/R Mapping yöntemini kullanarak iş katmanını SQL kodlarından temizleyip bu katmanın sadece iş mantığı algoritmasını içermesini ve uygulama geliştiricinin de sadece o katmana odaklanmasını, T-SQL ile boğuşmak yerine sadece OOP destekli dil ile işlemlerini yürütmesi sağlanmalıdır. ORM yöntemini tercih ettiğimizde aşağıdaki gibi bir T-SQL cümlesi veya stored procedure yerine</p>
<pre name="code" class="sql">UPDATE Musteri SET AdSoyad='Murat Şensoy'
WHERE MusteriId = 10</pre>
<p>aşağıdaki gibi bir kod yazmış olacağız.</p>
<pre name="code" class="c#">Musteri.AdSoyad = "Murat Şensoy"
oRm.Save(Musteri)</pre>
<p>Görüldüğü gibi CRUD (<i>create, read, update, delete</i>) işlemlerini OOP kurallarına göre yazmış oluyoruz. Böylece iş katmanını kodlayan yazılımcının yöntem alışkanlığı bozulmamış olmaktadır.</p>
<p>O/R Mapping modelinin geliştirme sürecinde kolaylık sağlamasına karşılık çalışma zamanında klasik yöntemle kıyaslandığında performans konusunda yeterince iyi olduğunu söyleyemeyiz. Bunun nedenlerini şu şekilde sıralayabiliriz:</p>
<ul>
<li>ORM, uygulama mimarisine veri erişim isminde yeni bir katman ekler.</li>
<li>Veri katmanı, veritabanına doğrudan erişemez.</li>
<li>SQL dilinin kompleks sorgu oluşturma ve çözmedeki gücünden yararlanılmaz.</li>
<li>ORM, uygulamanın veritabanı bağımsız olmasını sağladığı için o anda kullanılan VTYS&#8217;nin yeteneklerinden yararlanılamaz.</li>
</ul>
<p>Sonuç olarak O/R Mapping yönteminin zorunlu bir yöntem olmadığını ancak kompleks iş katmanına sahip büyük ölçekli kurumsal uygulamalarda veri erişim katmanını daha az kodla ve kısa sürede üretmeye yardımcı olduğu ve sonuçta yazılım mühendisinin üzerindeki yükü hafiflettiği için tercih nedeni olabileceğini söyleyebiliriz. Bu yöntemi kullanıp kullanmamak birazcık ta &#8220;<i>uygulama içerisinde klasik veri sorgulama ifadelerini (select, insert, update, delete) SQL ile manual mi oluşturacağız yoksa bunlar otomatik mi oluşturulmalı?</i>&#8221; sorusuna vereceğimiz yanıta bağlıdır.<br />
Tanımını, avantaj ve dejavantajını verdiğimiz ORM yönteminin .NET cephesindeki durumunu inceleyelim.</p>
<p><b><u>ADO.NET Entity Framework</u></b></p>
<p>Microsoft, ADO.NET 2.0 ile birlikte sunduğu <b>ObjectSpaces (OS.Net)</b> ürünüyle O/R Mapping çözümüne ilk adımını atmış oldu. ADO.NET 3.5 ile birlikte ObjectSpaces ürününü yeniden düzenleyerek <b>ADO.NET Entity Framework</b> isimli eklentiyi geliştirerek O/R Mapping alanındaki adımlarını daha da belirginleştirdi. </p>
<p>Entity Framework eklentisi, sadece bir O/R mapping aracı veya bir code generator olmanın ötesinde bunları da içinde barındıran ve uygulama içerisindeki varlıkları ve ilişkilerini sorgulamamızı sağlayan servisler bütünüdür. Entity Framework&#8217;ün servisleri aşağıdaki şekilde gösterilmiştir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/ER_Model_3.jpg"></p>
<p>ADO.NET Entity Framework&#8217;ün bir parçası olarak Framework ortamında ER modelinin oluşturulması için <b>Varlık Veri Modeli (Entity Data Model-EDM)</b> isimli konsept sunulmaktadır. EDM&#8217;yi veritabanı şemasını kavramsal ve mantıksal boyutta gösteren ve ilgili ORM haritasını oluşturan bir araç olarak değerlendirebiliriz. EDM, varlıklarla ilgili şemayı XML belgelerinde (CSDL, SSDL, MSL) saklar. Bu üç dosya, Entity Framework&#8217;ün üç temel boyutu olan kavramsal (<i>conceptual</i>), mantıksal (<i>logical</i>) ve haritalama (<i>mapping</i>) modelleriyle ilgili bilgileri içerir.</p>
<p><b>CSDL (Conceptual Schema Definition Language):</b> Varlıkların ve onlara ait ilişkilerin tanımlandığı dosya olup uygulamanın çekirdek veri modelini (core data model) teşkil eder. Uygulama katmanında varlıklar (nesneler), CSDL şeması referans alınarak oluşturulur. Bu şema, kavramsal şema formatına sahiptir.</p>
<p><b>SSDL (Store Schema Definition Language):</b> Veri kaynağı olarak kullanılacak veritabanına ait üstveri (metadata) bilgisini içerir. Mantıksal model için oluşturulan bu dosya, varlıklarla veri kaynağı arasındaki iletişimi kurar.</p>
<p><b>MSL (Mapping Specification Language):</b> CSDL dosyasındaki varlıkları SSDL dosyasında belirtilmiş tablolarla eşleştirir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/ER_Model_4.jpg"></p>
<p><b>Entity Client</b>, <i>SQLClient, OracleClient</i> gibi ADO.NET&#8217;in bir yönetilebilir veri sağlayıcısı (managed provider) olup EDM tarafından tanımlanmış olan veriye erişmeyi sağlar. Diğer sağlayıcılar gibi bunun da <i>EntityCommand, EntityConnection</i> ve <i>EntityTransaction</i> bileşenleri bulunur.</p>
<p>Object Services bileşeni, veri nesneleri üzerinde CRUD (<i>Create, Read, Update, Delete</i>) işlemleri için gerekli sorguları oluşturur. Bu sorgulama servisi, &#8220;Entity SQL&#8221; ve &#8220;LINQ to Entities&#8221; türü sorgulama destekler. <b>Entity SQL (eSQL)</b> ismindeki sorgulama dili, T-SQL&#8217; dilinden türemiş olup EDM modelindeki varlıkları ve aralarındaki ilişkileri sorgulamak için kullanılır. <b>LINQ to Entities</b> bileşeni de daha sonra yazılarda anlatacağımız LINQ teknolojisinin varlıkları sorgulamak için sunduğu bir sağlayıcıdır.</p>
 
<span class = "" style = "height: 25px;  float: left; "><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.ahmetkaymaz.com/2008/02/28/orm-linq-object-relational-mapping-adonet-entity-framework/&layout=standard&send=false&show_faces=false&width=&action=like&colorscheme=light&font=" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:25px"></iframe></span>]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2008/02/28/orm-linq-object-relational-mapping-adonet-entity-framework/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>XML İçeriğinin Girintili Yazılması</title>
		<link>http://www.ahmetkaymaz.com/2007/12/20/xml-iceriginin-girintili-yazilmasi/</link>
		<comments>http://www.ahmetkaymaz.com/2007/12/20/xml-iceriginin-girintili-yazilmasi/#comments</comments>
		<pubDate>Thu, 20 Dec 2007 13:02:00 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
				<category><![CDATA[C#, VB.NET, ASP.NET]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=217</guid>
		<description><![CDATA[Farklı veritabanları üzerinden çekilmiş olan XML verisinin bir dosyaya kayıt edilip ilgili alana FTP ile gönderildiği projede ihtiyaç duyduğum küçük bir örneği paylaşmak istiyorum. Düz metin formatında bulunan XML datasının standart XML formatından girintili olarak gösterilmesi. 
Ahmet KaymazEvin Adresiİşin Adresi
Bu düz metni aşağıdaki gibi XML yapısında biçimlendirelim. 

  
    Ahmet Kaymaz
 [...]]]></description>
			<content:encoded><![CDATA[<div class="google_plus_one"><g:plusone size="standard" count="true" url="http://www.ahmetkaymaz.com/2007/12/20/xml-iceriginin-girintili-yazilmasi/"></g:plusone></div><p>Farklı veritabanları üzerinden çekilmiş olan XML verisinin bir dosyaya kayıt edilip ilgili alana FTP ile gönderildiği projede ihtiyaç duyduğum küçük bir örneği paylaşmak istiyorum. Düz metin formatında bulunan XML datasının standart XML formatından girintili olarak gösterilmesi. <span id="more-217"></span></p>
<pre name="code" class="html"><Musteriler><Musteri><AdSoyad>Ahmet Kaymaz</AdSoyad><Adres><Ev>Evin Adresi</Ev><Is>İşin Adresi</Is></Adres></Musteri></Musteriler></pre>
<p>Bu düz metni aşağıdaki gibi XML yapısında biçimlendirelim. </p>
<pre name="code" class="xml"><Musteriler>
  <Musteri>
    <AdSoyad>Ahmet Kaymaz</AdSoyad>
    <Adres>
      <Ev>Evin Adresi</Ev>
      <Is>İşin Adresi</Is>
    </Adres>
  </Musteri>
</Musteriler></pre>
<p>Böylece daha okunaklı bir format elde edilmiş olunur.</p>
<pre name="code" class="csharp">using System;
using System.IO;
using System.Text;
using System.Xml;

public class Program
{

    static void Main()
    {

        Console.WriteLine(XmlBicimlendir("<Musteriler><Musteri><AdSoyad>Ahmet Kaymaz</AdSoyad><Adres><Ev>Evin Adresi</Ev><Is>İşin Adresi</Is></Adres></Musteri></Musteriler>"));
        Console.ReadLine();
    }

    public static String XmlBicimlendir(String XmlIcerik)
    {

        MemoryStream oMs = new MemoryStream();
        XmlTextWriter oXWrt = new XmlTextWriter(oMs, Encoding.Unicode);
        XmlDocument oXDoc = new XmlDocument();

        try
        {
            // XML içeriğini XmlDocument ile yükleyelim
            oXDoc.LoadXml(XmlIcerik);

            //XmlTextWriter nesnesini girintili olacak şekilde biçimlendirelim
            oXWrt.Formatting = Formatting.Indented;

            //XmlDocument içeriğini XmlTextWriter nesnesine yazdıralım
            oXDoc.WriteContentTo(oXWrt);
            //Nesnelerin sahip olduğu buffer alanını temizleyelim
            oXWrt.Flush();
            oMs.Flush();

            //MemoryStream'ın içeriğini okumak için alanın başladığı alana geri saralım
            oMs.Position = 0;

            //MemoryStream içeriğini bir StreamReader nesnesine aktaralım
            StreamReader oSr = new StreamReader(oMs);

            //StreamReader nesnesinden metni okuyalım
            XmlIcerik = oSr.ReadToEnd();
        }
        catch (XmlException ex)
        {
            XmlIcerik = "Hata Olustu." + ex.Message;
        }
        finally {
            oMs.Close();
            oXWrt.Close();
        }

        return XmlIcerik;
    }
}</pre>
<pre name="code" class="vb.net">Imports System
Imports System.IO
Imports System.Text
Imports System.Xml

Public Module Module1

    Sub Main()
        Console.WriteLine(XmlBicimlendir("<Musteriler><Musteri><AdSoyad>Ahmet Kaymaz</AdSoyad><Adres><Ev>Evin Adresi</Ev><Is>İşin Adresi</Is></Adres></Musteri></Musteriler>"))
        Console.ReadLine()
    End Sub

    Function XmlBicimlendir(ByVal XmlIcerik As String) As String

        Dim oMs As New MemoryStream()
        Dim oXWrt As New XmlTextWriter(oMs, Encoding.Unicode)
        Dim oXDoc As New XmlDocument()

        Try
            ' XML içeriğini XmlDocument ile yükleyelim
            oXDoc.LoadXml(XmlIcerik)

            'XmlTextWriter nesnesini girintili olacak şekilde biçimlendirelim
            oXWrt.Formatting = Formatting.Indented

            'XmlDocument içeriğini XmlTextWriter nesnesine yazdıralım
            oXDoc.WriteContentTo(oXWrt)
            'Nesnelerin sahip olduğu buffer alanını temizleyelim
            oXWrt.Flush()
            oMs.Flush()

            'MemoryStream'ın içeriğini okumak için alanın başladığı alana geri saralım
            oMs.Position = 0

            'MemoryStream içeriğini bir StreamReader nesnesine aktaralım
            Dim oSr As New StreamReader(oMs)

            'StreamReader nesnesinden metni okuyalım
            XmlIcerik = oSr.ReadToEnd()
        Catch ex As XmlException
            XmlIcerik = "Hata Olustu." &#038; ex.Message
        Finally
            oMs.Close()
            oXWrt.Close()
        End Try

        Return XmlIcerik
    End Function
End Module</pre>
 
<span class = "" style = "height: 25px;  float: left; "><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.ahmetkaymaz.com/2007/12/20/xml-iceriginin-girintili-yazilmasi/&layout=standard&send=false&show_faces=false&width=&action=like&colorscheme=light&font=" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:25px"></iframe></span>]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2007/12/20/xml-iceriginin-girintili-yazilmasi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

