https://buraksenyurt.com/Burak Selim Şenyurt - WCF 4.02016-08-03T13:07:57+00:00Matematik Mühendisi Bir Bilgisayar Programcısının NotlarıBurak Selim SenyurtBlogEngine.Net Syndication Generatorhttps://buraksenyurt.com/opml.axdBurak Selim SenyurtMatematik Mühendisi Bir Bilgisayar Programcısının Notlarıtr-TRBurak Selim Şenyurt0.0000000.000000https://buraksenyurt.com/post/WCF-Task-Bazli-Asenkron-OperasyonlarWCF Tarafında Task Bazlı Asenkron Operasyonlar2012-05-24T14:50:00+00:00bsenyurt<p><a href="https://buraksenyurt.com/pics/delegating.jpg"><img style="display: inline; margin-left: 0px; margin-right: 0px;" title="delegating" src="/pics/delegating_thumb.jpg" alt="delegating" width="300" height="237" align="right" /></a> Merhaba Arkadaşlar,</p>
<p>Yandaki karikatür, aşağıdaki yazıyı bitirdiğim zaman aradığım giriş resmi ile ilişkili olarak karşıma çıkan örneklerden sadece bir tanesiydi. Beni epey bir güldürdüğünü ve neşelendirdiğini ifade edebilirim <img title="Laughing" src="/editors/tiny_mce3/plugins/emotions/img/smiley-laughing.gif" alt="Laughing" border="0" /> Konumuz işlerimizi birilerine yönlendirip yan gelip yatmak değil elbette, ama ona benzer olduğunu ifade edebilirim.</p>
<p>Bu adamın görevlerini başkaların atadıktan sonra, söz konusu işler yapılırken başka işlere<em>(örneğin koltuğunda şöyle bir geriye doğru yaslanarak vakit geçirmek) </em>yönelebildiğine odaklanmaya çalışalım. <strong>.Net Framework </strong>tarafındaki <strong>Delegate </strong>tipleri de benzer bir ihtiyacı karşılamıyor mu? <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /> Asenkron olarak fonksiyonların çağırılabilmesini sağlamak<em>(Elbette başka yetenekleri de var ama bu en önemlileri arasında sayılabilir)</em></p>
<p>Uzun bir zamandır<strong> .Net Framework </strong>içerisinde, fonksiyonların asenkronize edilmesi üzerinde çalışılmaktadır. Daha önceleri <strong>Thread</strong> bazlı veya <strong>Delegate</strong> tipleri ile gerçekleştirdiğimiz asenkron çağırımlar,<strong> .Net Framework 4.0’</strong> a gömülü olarak gelen <strong>Task Parallel Library</strong> sayesinde daha da gelişmiş ve alt yapının her noktasına enjekte edilebilir olmuştur. Şu günlerde <strong>.Net Framework 4.5</strong> ile birlikte gündeme gelen ve uzun zamandır da haberdar olduğumuz <strong>async</strong>, <strong>await</strong> gibi anahtar kelimeler de, temel de <strong>Task</strong> tiplerine dayanmaktadır. Bir başka deyişle <strong>TPL</strong> kütüphanesi ve içeriği, ilerleyen zamanlarda<strong> .Net Framework’</strong> ün pek çok önemli alt yapısında etkisini hissettirecektir.</p>
<p>Bu yazımızda <strong>Task</strong> tiplerinden yararlanarak, <strong>WCF(Windows Communication Foundation)</strong> servislerinde asenkron operasyon tanımlamalarının nasıl yapılabileceğini ve incelemeye çalışıyor olacağız. Gerçekleştirmeyi planladığımız işlemlerde önemli olan nokta ise, asenkron yürütmelerin<strong> istemci(Client)</strong> tarafında değil, servis tarafındaki operasyonlar için söz konusu olmasıdır. Bir başka deyişle <strong>eş zamanlı olarak çalışabilen(Concurrent)</strong> servis operasyonlarının, <strong>Task </strong>tiplerinden yararlanarak nasıl asenkron hale getirilebileceğini görmeye çalışacağız. Elbette bu asenkronize edilmiş metodlar servis tarafında değerlendirilen bir yaklaşımı içerecektir.</p>
<p>Aslında bir servis operasyonunun asenkron çalışacak hale getirilmesi, <strong>delegate</strong> tipleri ile kullanabildiğimiz<em>(hatta Ado.Net 2.0’ dan bu yana pek çok XCommand gibi tipinde var olan)</em> <strong>Begin</strong>… ve <strong>End</strong>… ön ekli metod oluşumlarının uygulanmasından ibarettir. Aşağıdaki örnek kod parçasında sadece hatırlatıcı olması açısından bir <strong>Delegate</strong> tipi üzerinden ilgili <strong>BeginInvoke </strong>ve <strong>EndInvoke</strong> metodlarına nasıl ulaşılabildiği gösterilmeye çalışılmıştır. Örnekte <strong>Async Callback</strong> modeli değerlendirilmiştir. Bir başla deyişle asenkron olarak başlatılan metod işleyişini tamamladığında, uygulama ortamındaki başka bir geri bildirim fonksiyonu tetiklenmektedir.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.Collections.Generic;
namespace AzonTestClient
{
// Örnek bir generic temsilci
delegate int SaveToFileDelegate<T>(IEnumerable<T> list);
class Program
{
static void Main(string[] args)
{
#region Async Callback modeli
// Temsilci örneklenir
SaveToFileDelegate<object> dlg=new SaveToFileDelegate<object>(SaveToFile);
// BeginInvoke çağrısı ile dlg' nin işaret ettiği SaveToFile metodunun çağırılması ve kodun ifade sonundan itibaren akmaya devam etmesi sağlanır
// ilk parametre SaveToFile metodunun alacağı değişken, ikinci parametre işlem bittiğinde tetiklenecek geri bildirim fonksiyonunun işaretçisi olan temsilci, üçüncü parametre ise geri bildirim metodunda AsyncState özelliği üzerinden yakalanacan Delegate referansı
IAsyncResult asyncResult = dlg.BeginInvoke(new List<object>(), new AsyncCallback(Callback), dlg);
// akış buradan kesilmeden devam eder
#endregion
Console.ReadLine();
}
// Uzun süreli işlem içeren örnek metod
static int SaveToFile<T>(IEnumerable<T> list)
{
//TODO: Çok büyük boyutlu bir veri içeriğinin dosyaya yazılması söz konusudur. Zaman alan bir işlem olarak düşünülebilir
return 1;
}
// Async Callback tekniğine göre SaveToFileDelegate<T> ile işaret edilen metod sonlandığında devreye girecek olan geri bildirim fonksiyonu
static void Callback(IAsyncResult asyncResult)
{
// EndInvoke çağrısı ile ilişkili olan delegate tipi yakalanır
var dlg = asyncResult.AsyncState as SaveToFileDelegate<object>;
// delegate tipi üzerinden EndInvoke çağrısı yapılarak SaveToFile metodunun sonucu alınır
int result = dlg.EndInvoke(asyncResult);
// Sonuç değerlendirilir
}
}
}</pre>
<p><strong>Delegate</strong> tiplerinin kullanımı göz önüne alındığında, <strong>Polling</strong>, <strong>Callback</strong>, <strong>WaitHandle</strong> gibi modelleri destekleyebilen <strong>BeginInvoke</strong> ve <strong>EndInvoke</strong> metod çağırımlarının söz konusu olduğu bilinmektedir. <strong>BeginInvoke</strong> metodu <strong>IAsyncResult</strong> <strong>arayüzü(Interface)</strong> tipinden bir referans döndürmekte olup, program kod akışının izleyen satırdan devam edebilmesini sağlmaktadır. Pek tabi, <strong>EndInvoke</strong> metodu içerisinde de ilgili <strong>IAsyncResult</strong> arayüz referansından yararlanarak sonuçların alınması söz konusudur. Bu iki metod arasındaki çalışma süreci, ana sürece<em>(varsayılan olarak uygulamanın Main Thread’ i olarak da düşünebiliriz)</em> veya diğer süreçlere paralel olarak yürütülmektedir.</p>
<p>Dolayısıyla benzer bir yaklaşımı <strong>WCF</strong> servislerinde, asenkron hale getirilmek istenen operasyonlar için de düşünebiliriz. Gelin öncelikle senkron olarak uzun süren işlem içeren örnek bir <strong>WCF</strong> servisini geliştirelim. Bu amaçla aşağıdaki <strong>servis sözleşmesini(Service Contract)</strong> içeren bir servis uygulamasını göz önüne alabiliriz.</p>
<p><a href="https://buraksenyurt.com/pics/awcf_1.png"><img style="display: inline;" title="awcf_1" src="/pics/awcf_1_thumb.png" alt="awcf_1" width="528" height="265" /></a></p>
<p><strong>IProductService arayüz tipi(Interface);</strong></p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System.ServiceModel;
namespace AzonServices
{
[ServiceContract]
public interface IProductService
{
[OperationContract]
int CreateProducts(int totalProductCount);
}
}</pre>
<p><strong>ProductService sınıfı;</strong></p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.Collections.Generic;
namespace AzonServices
{
public class ProductService
: IProductService
{
public int CreateProducts(int totalProductCount)
{
int createdProductCount = 0;
char[] classes = {'C', 'D', 'E', 'L', 'S'};
List<Product> products = new List<Product>();
Random randomizer = new Random();
for (int i = 0; i < totalProductCount; i++)
{
Product newProduct = new Product
{
ProductId=i,
Name="PRD-"+i.ToString(),
ListPrice=randomizer.Next(1,100),
StockSize=randomizer.Next(50,500),
Class=classes[randomizer.Next(0,classes.Length)]
};
products.Add(newProduct);
createdProductCount++;
}
//TODO: product listesinin veritabanın yazılma veya dosyaya kayıt edilme işlemi yapılacak
return createdProductCount;
}
}
}</pre>
<p><strong>Product POCO sınıfı;</strong></p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">namespace AzonServices
{
class Product
{
public char Class { get; set; }
public int StockSize { get; set; }
public int ListPrice { get; set; }
public string Name { get; set; }
public int ProductId { get; set; }
}
}</pre>
<p><strong>CreateProducts</strong> metodu istemciden aldığı toplam miktara göre bir <strong>Product</strong> listesi üretmektedir. Test amaçlı olarak üretilen bu listenin içerisinde yer alan ürün bilgileri, rastgele değerlerden oluşmaktadır. İstemcinin vereceği maksimum ürün sayısına göre ilgili operasyonun uzun sürmesi olasıdır. İstemci açısından bakıldığında, söz konusu operasyonunun tamamlanana kadar uygulama içerisinde beklenmesine gerek yoktur. Bu, zaten istemci tarafında sahip olduğumuz ilgili servisi asenkron olarak çağırma yeteneğidir. Hatta servisi istemci tarafına eklerken <strong>Add Service Reference</strong> arabirimindeki ilgili opsiyon etkinleştirilerek servis operasyonlarının <strong>olay bazlı(Event Based) </strong>asenkron çağırım versiyonlarının üretilmesi sağlanabilmektedir.</p>
<blockquote>
<p>İstemci tarafında servis çağırımlarına ait asenkron operasyon desteğini etkinleştirmek için, Generate asynchronous operations özelliğinin işaretlenmiş olması gerekmektedir.</p>
</blockquote>
<p><a href="https://buraksenyurt.com/pics/awcf_2.png"><img style="display: inline;" title="awcf_2" src="/pics/awcf_2_thumb.png" alt="awcf_2" width="551" height="517" /></a></p>
<p>Sonuç olarak üretilen <strong>Async</strong> uzantılı asenkron çağırım metodu ve servis operasyon işleminin tamamlanması sonrası devreye girecek fonksiyonu işaret edecek olan <strong>olay(Event), </strong>kod tarafında değerlendirilebilir olacaktır.</p>
<p><a href="https://buraksenyurt.com/pics/awcf_3.png"><img style="display: inline;" title="awcf_3" src="/pics/awcf_3_thumb.png" alt="awcf_3" width="631" height="230" /></a></p>
<p>Gayet güzel <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /> Buraya kadar ki kısımda zaten pek bir sıkıntı yok açıkçası. Ancak şöyle bir durum da söz konusu,</p>
<blockquote>
<p>Servise eş zamanlı olarak gelen çağrılarda ve tek bir servis örneğinin(Instance) oluşmasının tercih edildiği durumlarda, servis üzerindeki bu yük nasıl asenkronize edilebilir?</p>
</blockquote>
<p>İşte yazımızın asıl konusu da budur.</p>
<p>Başlarda da belirttiğimiz gibi servis tarafında <strong>IAsyncResult</strong> arayüzü ve <strong>Task</strong> tiplerini kullanarak, <strong>eş zamanlı(Concurrent)</strong> olarak gelen çağrılarda, ilgili operasyonların servis tarafını gereksiz yere duraksatması engellenebilir. Bunun için <strong>IProductService</strong> <strong>servis sözleşmesini(Service Contract)</strong> ve <strong>ProductService</strong> sınıfını aşağıdaki gibi değiştirmemiz yeterli olacaktır.</p>
<p>Önce <strong>Class Diagram </strong>üzerinden ilgili değişikliklere bir bakalım.</p>
<p><a href="https://buraksenyurt.com/pics/awcf_4.png"><img style="display: inline;" title="awcf_4" src="/pics/awcf_4_thumb.png" alt="awcf_4" width="595" height="470" /></a></p>
<p><strong>IProductService arayüzünün yeni versiyonu;</strong></p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System.ServiceModel;
using System;
namespace AzonServices
{
[ServiceContract]
public interface IProductService
{
[OperationContract(AsyncPattern=true, Action="CreateProducts", Name="CreateProducts", ReplyAction ="CreateProductsReply")]
IAsyncResult BeginCreateProducts(int totalProductCount,AsyncCallback callback,object asyncState);
int EndCreateProducts(IAsyncResult result);
}
}</pre>
<p>Servis sözleşmesinde <strong>Begin</strong> ve <strong>End</strong> ön ekleri ile başlayan iki metod yer almaktadır. Dikkat edilmesi gereken noktalardan birisi, <strong>EndCreateProducts</strong> metodunun <strong>OperationContract</strong> <strong>niteliği(Attribute)</strong> ile <span style="text-decoration: underline;">imzalanmamış</span> oluşudur. Nitekim bu metod, <strong>BeginCreateProducts</strong> metodunun tamamlanması sonucu devreye giren metod olmakla birlikte, sadece servis tarafını ilgilendiren bir fonksiyondur. Dolayısıyla istemci tarafına açılmasına söz konusu değildir.</p>
<p><strong>BeginCreateProducts</strong> metoduna ait <strong>OperationContract</strong> niteliğinde ise bazı özellikler set edilmiştir. Herşeyden önce ilgili operasyonun <strong>Asenkron</strong> desene uygun olarak çalışacağının belirtilmesi gerekmektedir. Bu amaçla <strong>AsyncPattern</strong> özelliğine <strong>true</strong> değeri verilmiştir. Diğer taraftan aksiyon, operasyonun istemci tarafından görünecek olan adı ve istemci tarafında verilecek olan cevaba ait <strong>Action</strong> bilgisi de ilgili özelliklerce set edilmiştir.</p>
<p><strong>BeginCreateProducts</strong> metodu ve <strong>EndCreateProducts</strong> metodlarının şema yapılarına bakıldığında, <strong>temsilci(Delegate)</strong> tiplerinin <strong>BeginInvoke</strong> ve <strong>EndInvoke</strong> metodlarından farksız oldukları gözlemlenmektedir. <em>(İsimlendirme standartdını bozmamak açısından da bu şekilde bir adlandırma tercih edilmelidir)</em> </p>
<p><strong>BeginCreateProducts</strong> metodu, ilk parametre olarak istemciden gelecek olan <strong>integer</strong> değeri almaktadır. Son iki parametre ise değişmez sırada olmalıdır. Bunlardan birisi <strong>Callback</strong> metodunu işaret edecek olan <strong>AsyncCallback</strong> temsilcisi iken, son parametre de <strong>EndCreateProducts</strong> metodu içerisinde <strong>BeginCreateProducts</strong> fonksiyonunda başlatılan <strong>Task</strong> örneğini yakalamak ve dolasıyıyla sonucunu almak üzere kullanılan <strong>object</strong> referansıdır.</p>
<p><strong>ProductService sınıfının yeni versiyonu;</strong></p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading.Tasks;
namespace AzonServices
{
[ServiceBehavior(InstanceContextMode= InstanceContextMode.Single, ConcurrencyMode= ConcurrencyMode.Multiple)]
public class ProductService
: IProductService
{
public IAsyncResult BeginCreateProducts(int totalProductCount, AsyncCallback callback, object asyncState)
{
var task = new Task<int>((s) =>
{
int createdProductCount = 0;
char[] classes = {'C', 'D', 'E', 'L', 'S'};
List<Product> products = new List<Product>();
Random randomizer = new Random();
for (int i = 0; i < totalProductCount; i++)
{
Product newProduct = new Product
{
ProductId = i,
Name = "PRD-" + i.ToString(),
ListPrice = randomizer.Next(1, 100),
StockSize = randomizer.Next(50, 500),
Class =
classes[
randomizer.Next(0, classes.Length)
]
};
products.Add(newProduct);
createdProductCount++;
}
return createdProductCount;
}, asyncState);
task.ContinueWith((t) => { callback(t); });
task.Start();
return task;
}
public int EndCreateProducts(IAsyncResult result)
{
var task = (Task<int>) result;
return task.Result;
}
}
}</pre>
<p><strong>ProductService</strong> tipinin ilk dikkat çeken noktalarından birisi, <strong>ServiceBehvaior</strong> niteliğinde set edilen özelliklerdir. Servisin bellek üzerinde tek bir örnek olarak oluşturulması belirlendikten sonra<strong>(InstanceContextMode.Single),</strong> servis operasyonlarında <strong>Async</strong> değeri <strong>true</strong> olanlara da eş zamanlı olarak erşilebileceği ifade edilmektedir<strong>(ConcurrencyMode.Multiple)</strong></p>
<p><strong>BeginCreateProducts</strong> metodunun içerisinde <strong>Task</strong> tipinden yararlanıldığı görülmektedir. <strong>Asenkron</strong> olarak yürütülmek istenen operasyona ait kod parçaları <strong>Task</strong> tipi örneklenirken ilgili <strong>isimsiz metod(Anonymous Method)</strong> içerisine yazılmıştır. Bu örnekte <strong>Task</strong> tipinin <strong>generic</strong> bir versiyonun kullanıldığı görülmektedir. Nitekim metod geriye <strong>int</strong> tipinden bir sonuç döndürecek şekilde tasarlanmıştır. <strong>Task</strong> tipinin örneklenmesi sırasında kullanılan <strong>asyncState</strong> nesne örneği <strong>EndCreateProducts</strong> metodu içerisinde yakalanacak olan <strong>Task</strong> nesne örneğine ait referans olacaktır.</p>
<p>İlerleyen satırlarda <strong>task</strong> nesne örneğinin tamamlanması sonucu <strong>callback</strong> değişkeni ile ifade edilen çalışma zamanı metodunun tetiklenmesi ve <strong>t</strong> isimli <strong>Task</strong> değişkeninin<em>(ki bu t, task isimli değişkeni ifade etmektedir)</em> ilgili geri bildirim metodunun<em>(ki EndCreateProducts olmaktadır)</em> <strong>IAsyncResult</strong> arayüzüne atanması sağlanır<em>(<strong>ContinueWith</strong> kısmı).</em> <strong>Start</strong> metodu ile bildiğiniz üzere ilgili task örneği başlatılmaktadır. Bundan sonraki aşama ise oldukçta basittir. <strong>EndCreateProducts</strong> metoduna gelecek olan <strong>IAsyncResult</strong> arayüzünden yararlanılarak çalışma zamanındaki <strong>Task<int></strong> referansı yakalanmakta ve <strong>Result</strong> özelliği ile çalışma sonucu üretilen tamsayı değeri geriye, bir başka deyişle itemci tarafına döndürülmektedir.</p>
<p>Biraz karmaşık gözüken bir desen olduğunun farkındayım <img title="Undecided" src="/editors/tiny_mce3/plugins/emotions/img/smiley-undecided.gif" alt="Undecided" border="0" /> Ancak kalıp olarak düşünüldüğünde pek çok servis operasyonuna kolayca entegre edilebilecek bir yapı olarak düşünülebilir. Elbette bu konuyu bir de, <strong>.Net Framework 4.5’</strong> e entegre olarak gelen yeni <strong>async</strong> ve <strong>await</strong> anahtar kelimelerini göz önüne alarak değerlendirmekte yarar vardır. Bunu da ilerleyen zamanlarda incelemeyi planlamaktayım <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /> Böylece geldik bir yazımızın daha sonuna. Bir sonraki yazımızda görüşünceye dek hepinize mutlu günler dilerim.</p>
<p><a href="https://buraksenyurt.com/pics/2012%2f3%2fAzonServices.zip">AzonServices.zip (67,73 kb)</a></p>2012-05-24T14:50:00+00:00wcfwindows communication foundationtask parallel librarytpliasyncresultbsenyurtUzun bir zamandır .Net Framework içerisinde, fonksiyonların asenkronize edilmesi üzerinde çalışılmaktadır. Daha önceleri Thread bazlı veya Delegate tipleri ile gerçekleştirdiğimiz asenkron çağırımlar, .Net Framework 4.0’ a gömülü olarak gelen Task Parallel Library sayesinde daha da gelişmiş ve alt yapının her noktasına enjekte edilebilir olmuştur. Şu günlerde .Net Framework 4.5 ile birlikte gündeme gelen ve uzun zamandır da haberdar olduğumuz async, await gibi anahtar kelimeler de, temel de Task tiplerine dayanmaktadır. Bir başka deyişle TPL kütüphanesi ve içeriği, ilerleyen zamanlarda .Net Framework’ ün pek çok önemli alt yapısında etkisini hissettirecektir.https://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=d36bb0e8-9956-4e22-aede-221f444359b50https://buraksenyurt.com/trackback.axd?id=d36bb0e8-9956-4e22-aede-221f444359b5https://buraksenyurt.com/post/WCF-Task-Bazli-Asenkron-Operasyonlar#commenthttps://buraksenyurt.com/syndication.axd?post=d36bb0e8-9956-4e22-aede-221f444359b5https://buraksenyurt.com/post/Entity-Framework-ile-Gercek-Hayat-Ornekleri-WebinerlerimEntity Framework ile Gerçek Hayat Örnekleri Webinerlerim2011-12-06T08:51:00+00:00bsenyurt<p><img style="float: right;" src="../..http://www.buraksenyurt.com/pics/2011%2f12%2fnedirlogo.gif" alt="" /></p>
<p>Merhaba Arkadaşlar,</p>
<p>Uzun zamandır <a title="NedirTv?Com" href="http://www.nedirtv.com/" target="_blank"><strong>NedirTv?com</strong></a> bünyesinde webiner gerçekleştirmiyordum <img title="Embarassed" src="../../editors/tiny_mce3/plugins/emotions/img/smiley-embarassed.gif" border="0" alt="Embarassed" /> Bununla birlikte geçtiğimiz ay <strong>Zenith </strong>adına verdiğimiz <strong>Entity Framework 4.0 </strong>eğitiminde <strong>WCF(Windows Communication Foundation)</strong> tabanlı güzel bir gerçek hayat örneği geliştirdik. Aslına bakarsanız geliştirdiğimiz bu örneği sizler ile de paylaşmak istedik. Bu sebepten önümüzdeki <strong>12 </strong>ve <strong>13 Aralık </strong>tarihlerinde iki bölüm halinde yayınlanacak olan webinerlerimizde söz konusu uygulamayı canlı olarak geliştirmek istiyoruz. Değerli katılımlarınızı bekliyoruz <img title="Wink" src="../../editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" border="0" alt="Wink" /> İki bölümden oluşacak olan webinerlerimizde, <strong>Entity Framework, Windows Communication Foundation, Business Logic Layer, Surrogate Types</strong> gibi kavramlara değiniyor olacağız.</p>
<div class="webiner_alan"><strong><label>Konu</label> : Entity Framework ile Gerçek Hayat Örnekleri-1</strong><label></label></div>
<div class="webiner_alan"><label>Konuşmacı</label> : Burak Selim ŞENYURT<label></label></div>
<div class="webiner_alan"><label>Zaman</label> : 12.12.2011 21:00:00</div>
<div class="webiner_alan"><a href="http://nedirtv.com/webiner/46" target="_blank">Katılmak </a> <a href="http://nedirtv.com/webiner/46" target="_blank">için tıklayın</a><br /></div>
<p><strong><label>Konu</label> : Entity Framework ile Gerçek Hayat Örnekleri-2</strong><label><br />Konuşmacı</label> : Burak Selim ŞENYURT</p>
<p><label>Zaman</label> : 13.12.2011 21:00:00<br /><a href="http://nedirtv.com/webiner/48">Katılmak için tıklayın</a></p>2011-12-06T08:51:00+00:00entity frameworknedir?tvsurrogate typesbusiness logic layerwcfbsenyurthttps://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=9f7d14c7-e37b-4039-a2ae-4c14cb2c02860https://buraksenyurt.com/trackback.axd?id=9f7d14c7-e37b-4039-a2ae-4c14cb2c0286https://buraksenyurt.com/post/Entity-Framework-ile-Gercek-Hayat-Ornekleri-Webinerlerim#commenthttps://buraksenyurt.com/syndication.axd?post=9f7d14c7-e37b-4039-a2ae-4c14cb2c0286https://buraksenyurt.com/post/Birlikte-GelistirdikBirlikte Geliştirdik2011-10-02T23:48:00+00:00bsenyurt<p><a href="https://buraksenyurt.com/pics/corba_739.jpg"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; padding-top: 0px; border: 0px;" title="corba_739" src="/pics/corba_739_thumb.jpg" alt="corba_739" width="240" height="240" align="right" border="0" /></a>Merhaba Arkadaşlar,</p>
<p>Eğer benim gibi yaz kış kolayca grip oluyorsanız eminim ki bol limonlu çorbalara aşinasınızdır. Hele ki şanslıysanız ve eşinizin ya da annenizin yanındaysanız şöyle evde var olan tüm sebzelerden oluşan karma bir sebze çorbası süper rahatlatıcı olacaktır. E bazen .Net Framework tarafında da eldeki materyalleri bir araya getirip güzel bir çorba yapmak gerekir <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="/pics/wlEmoticon-winkingsmile_67.png" alt="Göz kırpan gülümseme" /> Güzel bir çorba hazırlamaya ne dersiniz?</p>
<p>Hazırlayacağımız çorbamızda çok kıymetli yardımcılarımız da var. Son katılımcılarımız ile gerçekleştirmekte olduğumuz <strong>Asp.Net</strong> eğitiminden çok güzel fikirler ve örnekler çıkmaya devam ediyor. Geliştireceğimiz örnek <strong>Solution</strong> içerisinde <strong>Entity Framework, WCF Service, LINQ, Asp.Net Web Application, Web User Control, LINQ</strong> gibi pek çok kavram yer almakta. Temel olarak başlangıçtaki senaryomuz ise şu : <em>“Asp.Net web uygulamamızda yer alan bir Web User Control’ ümüz, AdventureWorks veritabanında yer alan herhangibir Product' satırına ait bazı alan bilgilerini gösterecek”</em></p>
<p>Pekala bu iş için hemen bir <strong>Web User Control</strong> geliştirebilir ve <strong>Load</strong> metodunda ilgili veri çekme işlemlerini gerçekleştirerek basitçe sonuca gitmeyi düşünebilirsiniz. Ama biz bu şekilde button arkası programlama yapmamayı tercih ediyoruz <img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="/pics/wlEmoticon-smile_16.png" alt="Gülümseme" /> Bunun yerine aşağıdaki grafikte yer alan Solution içeriğini üreterek ilerleyeceğiz. <em>(Dilerseniz yazının son satırından Solution’ ı indirip inceleyin)</em></p>
<p><a href="https://buraksenyurt.com/pics/bei_10.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="bei_10" src="/pics/bei_10_thumb.gif" alt="bei_10" width="268" height="549" border="0" /></a></p>
<p><img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="/pics/wlEmoticon-smile_16.png" alt="Gülümseme" /> İlk olarak <strong>AdventureWorks</strong> veritabanındaki bazı tabloları içerecek olan <strong>Entity Model’</strong> imizi tasarlayarak işe başlayalım. Söz konusu <strong>Class Library</strong> projesi içerisinde kullanacağımız <strong>Entity Model</strong> diagramının içeriğini ise başlangıçta aşağıdaki gibi oluşturabiliriz.</p>
<p><a href="https://buraksenyurt.com/pics/bei_11.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="bei_11" src="/pics/bei_11_thumb.gif" alt="bei_11" width="530" height="155" border="0" /></a></p>
<p>Şimdilik <strong>Product</strong> ve <strong>ProductSubCategory</strong> tablolarının karşılığı olan Entity içeriklerinin yer aldığı bir diagram ile karşı karşıyayız. Diğer yandan<strong> Web User Control’</strong> ümüzü geliştirene kadar kat etmemiz gereken daha çok yolumuz olacak. Öncelikle bir <strong>Product</strong> içeriğini dış ortama verecek olan iş fonksiyonelliklerini içeren bir katman daha yazacağız. Söz konusu katman tahmin edeceğiniz üzere bir <strong>Class Library</strong> olacak. Bu katmanda ekstradan bir<strong> Business Object</strong> daha kullanıyor olacağız. <em>Çünkü <strong>Product</strong> tipinin tüm içeriğini dış ortama sunmak gibi bir niyetimiz olmadığını düşünmekteyiz.</em> Bu sebepten <strong>Product</strong> tipi yerine geçecek olan bir<strong> Surrogate Type</strong> kullanımını ele alacağız. Dolayısıyla <strong>Company.Operations</strong> isimli <strong>Class Library</strong> içeriğini aşağıdaki sınıf çizelgesinde olduğu gibi tasarlayarak devam ediyoruz.</p>
<p><a href="https://buraksenyurt.com/pics/bei_12.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="bei_12" src="/pics/bei_12_thumb.gif" alt="bei_12" width="364" height="323" border="0" /></a></p>
<p>Burada görülen <strong>ProductBusinessObject</strong> aslında dış ortama sunulacak olan <strong>Product</strong> içeriğini taşıyan bir <strong>POCO</strong> nesnesidir. Aslında bu tip <strong>Business Object</strong> türlerini başka bir katman içerisinde tutmayı da düşünebiliriz <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="/pics/wlEmoticon-winkingsmile_67.png" alt="Göz kırpan gülümseme" /> </p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">namespace Company.Operations
{
public class ProductBusinessObject
{
public int ProductId { get; set; }
public string Name { get; set; }
public decimal ListPrice { get; set; }
public string SubCategoryName { get; set; }
public string Color { get; set; }
}
}</pre>
<p><strong>ProductionOperations</strong> isim sınıfımız ise şu an için tek bir operasyon sunmaktadır ve <strong>ProductId</strong> değerine göre <strong>ProductBusinessObject</strong> tipinden bir referans döndürmek üzere tasarlanmıştır.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System.Linq;
using AdventureWorksEntity;
namespace Company.Operations
{
public class ProductionOperations
{
public ProductBusinessObject GetProduct(int ProductId)
{
ProductBusinessObject result = null;
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
result = (from p in context.Products
where p.ProductID == ProductId
select new ProductBusinessObject
{
ProductId=p.ProductID,
Name=p.Name,
ListPrice=p.ListPrice,
Color=p.Color,
SubCategoryName=p.ProductSubcategory.Name
}).FirstOrDefault<ProductBusinessObject>();
}
return result;
}
}
}</pre>
<p>Örneğimizi <strong>EF 4.0</strong> versiyonu ile geliştirdiğimiz için bir <strong>Lazy Loading</strong> durumunun da söz konusu olduğunu ifade edelim. <strong>SubCategoryName</strong> özelliğine değer atanan satıra dikkat edin <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="/pics/wlEmoticon-winkingsmile_67.png" alt="Göz kırpan gülümseme" /></p>
<p>Artık söz konusu iş operasyonunu dış dünyaya sunacak bir uygulamayı da geliştirebiliriz. Bu uygulama favorimiz olan <strong>WCF</strong> tabanlı bir servis olarak düşünülmektedir. Böylece <strong>Entity</strong> modelimiz, <strong>Business Object’</strong> lerimiz ve <strong>Business Operasyonlarımızın</strong> tamamı söz konusu servis uygulamasının arkasında kalacaktır. Yani asıl End User’ lar bu işlevselliklere erişebilmek için servis katmanı üzerinden geçmek zorunda kalacaklardır. WCF Service uygulamamızın içeriği aşağıdaki diagramda görüldüğü gibidir.</p>
<p><a href="https://buraksenyurt.com/pics/bei_13.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="bei_13" src="/pics/bei_13_thumb.gif" alt="bei_13" width="355" height="329" border="0" /></a></p>
<p><strong>IProductionService</strong> isimli <strong>servis sözleşmemiz(Service Contract)</strong> şu şekildedir;</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System.ServiceModel;
using Company.Operations;
namespace AdventureWorksService
{
[ServiceContract]
public interface IProductionService
{
[OperationContract]
ProductBusinessObject GetProduct(int ProductId);
}
}</pre>
<p>Sözleşmemiz senaryomuza göre bir ürünün elde edilmesi ve <strong>ProductBusinessObject</strong> tipinden geriye döndürülmesi işlemini üstlenen basit bir operasyon sunmaktadır. Bu operasyonun uyarlaması ise <strong>ProductionService</strong> sınıfı içerisinde gerçekleştirilmektedir.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using Company.Operations;
namespace AdventureWorksService
{
public class ProductionService
: IProductionService
{
ProductionOperations productionOperator = new ProductionOperations();
public ProductBusinessObject GetProduct(int ProductId)
{
return productionOperator.GetProduct(ProductId);
}
}
}</pre>
<p>Servis uygulamamızda dikkat edilmesi gereken noktalardan birisi de, <strong>AdventureWorks</strong> entity modelini kullanabilmesi için gerekli <strong>Connection String</strong> bilgisine sahip olma zorunluluğudur. Bildiğiniz üzere Entity Modelimizi bir <strong>Class Library</strong> içerisinde tutumaktayız ve çalışma zamanında ilgili mapping işlemlerini üstlenecek olan yürütücü uygulamanın söz konusu mapping için bir bağlantı bilgisine sahip olması gerekiyor. Dolayısıyla <strong>AdventureWorksEntity</strong> kütüphanesinde otomatik olarak üretilen <strong>connection string</strong> bilgisinin servis uygulamasındaki <strong>web.config</strong> dosyasında yer alması şart.</p>
<pre class="brush:xml;auto-links:false;toolbar:false" contenteditable="false"><?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="AdventureWorksEntities" connectionString="metadata=res://*/AdventureModel.csdl|res:
//*/AdventureModel.ssdl|res://*/AdventureModel.msl;
provider=System.Data.SqlClient;provider connection string="Data Source=.;Initial Catalog=AdventureWorks;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
</connectionStrings>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
</configuration></pre>
<p>Çorbamıza yeni baharatlar katarak devam edelim <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="/pics/wlEmoticon-winkingsmile_67.png" alt="Göz kırpan gülümseme" /></p>
<p>Artık servis uygulamamız da hazır olduğuna göre bunu kullanacak olan <strong>Asp.Net Web</strong> <strong>Uygulamasını</strong> geliştirerek yol alabiliriz. Tahmin edileceği üzere Asp.Net Web uygulamamız, <strong>AdventureWorksService</strong> isimli <strong>WCF Servisini</strong> referans etmelidir.</p>
<p><a href="https://buraksenyurt.com/pics/bei_17.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="bei_17" src="/pics/bei_17_thumb.gif" alt="bei_17" width="282" height="225" border="0" /></a></p>
<p>Yazımızın başında belirttiğimiz senaryomuzdan hatırlayacağınız üzere bir <strong>Web User Control’</strong> den bahsediyorduk. Bu <strong>Web User Control’</strong> ün <strong>Business Object’</strong> imize göre tasarlanması gerekiyor. Bu amaçla aşağıdaki gibi bir tasarım gerçekleştirebiliriz.</p>
<p><a href="https://buraksenyurt.com/pics/bei_14.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="bei_14" src="/pics/bei_14_thumb.gif" alt="bei_14" width="419" height="267" border="0" /></a></p>
<pre class="brush:html;auto-links:false;toolbar:false" contenteditable="false"><%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ProductControl.ascx.cs" Inherits="CompanyPortal.ProductControl" %>
<style type="text/css">
.style1
{
width: 400px;
font-family: "Courier New", Courier, monospace;
}
.style2
{
width: 176px;
}
.style3
{
width: 176px;
font-weight: bold;
}
</style>
<table border="1" cellpadding="5" cellspacing="1" class="style1">
<tr>
<td class="style2">
</td>
<td style="text-align: right">
<asp:Label ID="ProductIdLabel" runat="server"></asp:Label>
</td>
</tr>
<tr>
<td class="style3">
Name</td>
<td>
<asp:Label ID="ProductNameLabel" runat="server"></asp:Label>
</td>
</tr>
<tr>
<td class="style3">
List Price</td>
<td>
<asp:Label ID="ProductListPriceLabel" runat="server"></asp:Label>
</td>
</tr>
<tr>
<td class="style3">
Color</td>
<td>
<asp:Label ID="ProductColorLabel" runat="server"></asp:Label>
</td>
</tr>
<tr>
<td class="style3">
Sub Category Name</td>
<td>
<asp:Label ID="ProductSubCategoryNameLabel" runat="server"></asp:Label>
</td>
</tr>
</table></pre>
<p>Kod tarafında ise aşağıdaki işlemleri gerçekleştirebiliriz.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using CompanyPortal.Production;
namespace CompanyPortal
{
public partial class ProductControl
: System.Web.UI.UserControl
{
ProductionServiceClient proxy = new ProductionServiceClient();
int productId;
public int ProductId
{
get { return productId; }
set { productId = value; }
}
public string ProductName
{
get { return ProductNameLabel.Text; }
}
public decimal ProductListPrice
{
get { return Decimal.Parse(ProductListPriceLabel.Text); }
}
public string ProductColor
{
get { return ProductColorLabel.Text; }
}
public string ProductSubCategoryName
{
get { return ProductSubCategoryNameLabel.Text; }
}
public void LoadContent()
{
ProductBusinessObject bO = proxy.GetProduct(ProductId);
if (bO != null)
{
ProductIdLabel.Text = bO.ProductId.ToString();
ProductNameLabel.Text = bO.Name;
ProductListPriceLabel.Text = bO.ListPrice.ToString();
ProductColorLabel.Text = bO.Color;
ProductSubCategoryNameLabel.Text = bO.SubCategoryName;
}
}
}
}</pre>
<p>Dikkat edileceği üzere <strong>Web User Control</strong> herhangibir ürün numarasına bağlı bir <strong>ProductBusinessObject</strong> içeriğini dış ortama <strong>özellikler(Properties)</strong> yardımıyla da sunmaktadır. Ayrıca içerisinde yer alan <strong>Label</strong> kontrollerinin çalışma zamanında yüklenmesi için <strong>LoadContent</strong> isimli bir metoddan yararlanılmaktadır.</p>
<p>Artık <strong>Web User Control</strong> bileşenimizi örnek bir <strong>aspx</strong> sayfasında kullanmaya çalışarak ilk testimizi gerçekleştirebiliriz. Bunun için aşağıdaki tasarıma ve kod içeriğine sahip bir sayfa eklediğimizi düşünelim.</p>
<p><a href="https://buraksenyurt.com/pics/bei_15.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="bei_15" src="/pics/bei_15_thumb.gif" alt="bei_15" width="290" height="155" border="0" /></a></p>
<pre class="brush:html;auto-links:false;toolbar:false" contenteditable="false"><%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="CompanyPortal.Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
Ürün Numarasını Girin :
<asp:TextBox ID="ProductIdTextBox" runat="server"></asp:TextBox>
<br />
<br />
<asp:Button ID="GetProductButton" runat="server"
onclick="GetProductButton_Click" Text="Get Product" />
<br />
<br />
<asp:PlaceHolder ID="ProductPlaceHolder" runat="server"></asp:PlaceHolder>
</div>
</form>
</body>
</html></pre>
<p>ve kod içeriği;</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
namespace CompanyPortal
{
public partial class Default : System.Web.UI.Page
{
protected void GetProductButton_Click(object sender, EventArgs e)
{
int productId;
if (Int32.TryParse(ProductIdTextBox.Text, out productId))
{
ProductControl prdControl = LoadControl("ProductControl.ascx") as ProductControl;
if (prdControl != null)
{
prdControl.ProductId = productId;
prdControl.LoadContent();
ProductPlaceHolder.Controls.Add(prdControl);
}
}
}
}
}</pre>
<p>Sayfamızda sembolik olarak <strong>TextBox</strong> kontrolüne girilen sayısal değere göre <strong>Product</strong> bilgisinin çekilmesi ve bulunan ürüne ait bazı bilgilerin dinamik olarak yüklenen <strong>Web User Control</strong> içerisinde gösterilmesi sağlanmaktadır. Söz gelimi çalışma zamanında <strong>774</strong> numaralı ürüne ait bilgileri çekmek istersek aşağıdaki ekran görüntüsünde yer alan sonucu elde ederiz <img class="wlEmoticon wlEmoticon-openmouthedsmile" style="border-style: none;" src="/pics/wlEmoticon-openmouthedsmile_16.png" alt="Açık ağızlı gülümseme" /></p>
<p><a href="https://buraksenyurt.com/pics/bei_16.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="bei_16" src="/pics/bei_16_thumb.gif" alt="bei_16" width="429" height="335" border="0" /></a></p>
<p>Eğer örneği buraya kadar başarılı bir şekilde getirdiyseniz şöyle bir arkanıza yaslanın ve neler yaptığımızı bir düşünün <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="/pics/wlEmoticon-winkingsmile_67.png" alt="Göz kırpan gülümseme" /></p>
<p>Son olarak <strong>Solution</strong> içerisinde yer alan <strong>Assembly’</strong> lar arasındaki ilişkiyi göstererek yazımızı yavaş yavaş sonlandıralım.</p>
<p><a href="https://buraksenyurt.com/pics/bei_9.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="bei_9" src="/pics/bei_9_thumb.gif" alt="bei_9" width="640" height="200" border="0" /></a></p>
<p>Örneği geliştirmek, farklı testler uygulayarak olası hataları düzeltmek, kodu tekrardan gözden geçirip iyileştirmek de sizin göreviniz olsun. Söz gelimi bir alt kategoriye bağlı ürünleri <strong>ProductBusinessObject</strong> tipinden çekip her biri için dinamik olarak <strong>ProductControl</strong> bileşeni üreten ve web sayfasına ekleyen bir senaryoyu çözümümüze ilave edebilirsiniz. Hatta alt kategori bilgilerinin Web uygulaması arayüzüne dahil edilmesi için gerekli geliştirmeleri de yapabilirsiniz. Eğer buraya kadar yaptıklarımızla kafanız çok karıştıysa aşağıdaki parçayı dinleyip kendinize gelmeyi de deneyebilirsiniz <img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="/pics/wlEmoticon-smile_16.png" alt="Gülümseme" /></p>
<p><object width="250" height="40">
<param name="movie" value="http://grooveshark.com/songWidget.swf" />
<param name="wmode" value="window" />
<param name="allowScriptAccess" value="always" />
<param name="flashvars" value="hostname=cowbell.grooveshark.com&songIDs=32204406&style=wood&p=0" /><embed type="application/x-shockwave-flash" width="250" height="40" src="http://grooveshark.com/songWidget.swf" wmode="window" allowscriptaccess="always" flashvars="hostname=cowbell.grooveshark.com&songIDs=32204406&style=wood&p=0" />
</object></p>
<p>Tekrardan görüşünceye dek hepinize mutlu günler dilerim.</p>
<p><a href="https://buraksenyurt.com/pics/2011%2f10%2fCompany.rar">Company.rar (153,21 kb)</a></p>2011-10-02T23:48:00+00:00web user controldynamic control loadingentity frameworklinqwcfserviceentity modelbsenyurtHazırlayacağımız çorbamızda çok kıymetli yardımcılarımız da var. Son katılımcılarımız ile gerçekleştirmekte olduğumuz Asp.Net eğitiminden çok güzel fikirler ve örnekler çıkmaya devam ediyor. Geliştireceğimiz örnek Solution içerisinde Entity Framework, WCF Service, LINQ, Asp.Net Web Application, Web User Control, LINQ gibi pek çok kavram yer almakta. Temel olarak başlangıçtaki senaryomuz ise şu : “Asp.Net web uygulamamızda yer alan bir Web User Control’ ümüz, AdventureWorks veritabanında yer alan herhangibir Product' satırına ait bazı alan bilgilerini gösterecek”https://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=595060d7-fb4b-4fc9-bb48-1a2ad9f901a30https://buraksenyurt.com/trackback.axd?id=595060d7-fb4b-4fc9-bb48-1a2ad9f901a3https://buraksenyurt.com/post/Birlikte-Gelistirdik#commenthttps://buraksenyurt.com/syndication.axd?post=595060d7-fb4b-4fc9-bb48-1a2ad9f901a3https://buraksenyurt.com/post/Tek-Fotoluk-Ipucu-15Tek Fotoluk İpucu - 15(Self Hosted Workflow Service)2011-07-07T08:05:00+00:00bsenyurt<p>Merhaba Arkadaşlar,</p>
<p>Elinizde bir Workflow Service kütüphanesi ve XAMLX uzantılı Workflow Service dosyaları var. Bu dosyalardan yararlanarak kendi Workflow Service Host uygulamanızı yazmak niyetindesiniz. Diyelim ki bu uygulama bir Console projesi olacak. Nasıl yaparsınız? İşte böyle <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" src="http://www.buraksenyurt.com/pics/wlEmoticon-winkingsmile_33.png" alt="Winking smile" /></p>
<p><a href="http://www.buraksenyurt.com/pics/PhotoTrick15.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="PhotoTrick15" src="http://www.buraksenyurt.com/pics/PhotoTrick15_thumb.png" border="0" alt="PhotoTrick15" width="602" height="502" /></a></p>
<p><a href="http://www.buraksenyurt.com/pics/2011%2f7%2fProductsWorkflowHost.rar">ProductsWorkflowHost.rar (38,48 kb)</a></p>2011-07-07T08:05:00+00:00wcfwfworkflow serviceswindows workflow foundationwindows communication foundationbsenyurthttps://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=8b2adca8-a31d-4936-9a07-371dbb3326cd0https://buraksenyurt.com/trackback.axd?id=8b2adca8-a31d-4936-9a07-371dbb3326cdhttps://buraksenyurt.com/post/Tek-Fotoluk-Ipucu-15#commenthttps://buraksenyurt.com/syndication.axd?post=8b2adca8-a31d-4936-9a07-371dbb3326cdhttps://buraksenyurt.com/post/Tek-Fotoluk-Ipucu-13(XmlSerializer-ile-Daha-Fazla-Kontrol)Tek Fotoluk İpucu-13(XmlSerializer ile Daha Fazla Kontrol)2011-07-04T23:02:00+00:00bsenyurt<p>Merhaba Arkadaşlar,</p>
<p>Bazen SOAP Bazlı WCF servisimizdeki veri türlerinin, .Net tabanlı olmayan platformlarda yer alan istemci veya servislerle daha kolay anlaşabilmesini sağlamak isteyebiliriz. Özellikle bu noktada XmlSerializer işimizi kolaylaştırabilir. Nasıl mı? <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" src="http://www.buraksenyurt.com/pics/wlEmoticon-winkingsmile_31.png" alt="Winking smile" /></p>
<p><a href="http://www.buraksenyurt.com/pics/PhotoTrick13.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="PhotoTrick13" src="http://www.buraksenyurt.com/pics/PhotoTrick13_thumb.png" border="0" alt="PhotoTrick13" width="433" height="694" /></a></p>
<p><a href="http://www.buraksenyurt.com/pics/2011%2f6%2fUseXmlSerializer.rar">UseXmlSerializer.rar (18,30 kb)</a></p>2011-07-04T23:02:00+00:00wcfwcf 4.0xmlsoapxml serializationxml serializerwindows communication foundationbsenyurthttps://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=4b4c8a29-afa5-4c74-80e3-7ad9cda486221https://buraksenyurt.com/trackback.axd?id=4b4c8a29-afa5-4c74-80e3-7ad9cda48622https://buraksenyurt.com/post/Tek-Fotoluk-Ipucu-13(XmlSerializer-ile-Daha-Fazla-Kontrol)#commenthttps://buraksenyurt.com/syndication.axd?post=4b4c8a29-afa5-4c74-80e3-7ad9cda48622