https://buraksenyurt.com/Burak Selim Şenyurt - WCF Data Services2016-08-03T13:08:34+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-Data-Services-Reflection-ProviderWCF Data Services – Reflection Provider Kullanımı2012-05-01T01:25:00+00:00bsenyurt<p><img style="border-style: initial; border-color: initial; float: right;" src="/pics/2012%2f3%2f1316795_bicycle.jpg" alt="" />Merhaba Arkadaşlar,</p>
<p>Bundan bir kaç yıl öncesiydi. Daha dün gibi hatırlıyorum. <strong>.Net Framework 3.0</strong> sürümünde çıkması beklenen yeni <strong>Foundation </strong>alt yapıları üzerine <strong>Microsoft </strong>ekibinden gelen elektronik bir postayı okuyordum. O zamana kadar <strong>XML Web Service</strong>' leri ve özellikle<strong> .Net Remoting</strong> ile yakın ilişkiler içerisinde bulunduğumdan, dikkatimi ilk çeken <strong>Windows Communication Foundation</strong> isimli konsept olmuştu. Kısaca <strong>WCF </strong>olarak adlandırılıyordu. Mutlaka üzerine eğilmem gerektiğini düşündüğüm bir konuydu. Benim için yeni bir macera başlıyordu. </p>
<p>Hem heyecanlıydım hem de biraz korkmuştum <img title="Undecided" src="/editors/tiny_mce3/plugins/emotions/img/smiley-undecided.gif" alt="Undecided" border="0" /> Çünkü var olan tüm servis yaklaşımlarını tek bir çatı altında toplayacak bir modelden bahsediliyordu<em>(Onun şimdiki halini ve yaygınlığını düşündüğümüzde, Microsoft' un bu vizyonunda gerçekten de haklı olduğunu bir kez daha görebiliyorum) </em>Hemen araştırmalara başlamalıydım. Internet Explorer' ımı açtım ve <strong>WCF</strong> kelimesini googleladım. Bir de ne göreyim. Karşıma <strong>Dünya Bisiklet Federasyonu(World Cycling Federations)</strong> ile ilişkili sonuçlar çıktı. Yandaki fotoğrafın anlamı bundandır <img title="Tongue out" src="/editors/tiny_mce3/plugins/emotions/img/smiley-tongue-out.gif" alt="Tongue out" border="0" /> Geyiği bir kenara bırakıp konumuza dönelim.</p>
<p><strong>Windows Communication Foundation(WCF)</strong> yıllardır <strong>Microsoft</strong> mimarisinde önemli bir yere sahip. Özellikle servis bazlı uygulama geliştirme modeline kazandırdığı pek çok yeni yaklaşım sayesinde, var olan ve gelecek <strong>Microsoft</strong> ürünlerinin de pek çok noktasında kullanılmaya başlandı. Bana göre <strong>WCF</strong> modeli özellikle <strong>3.5</strong> sürümü ile başlayan gelişmeler ile birlikte programlama modelini önemli derece de geliştirdi. Bu gün mimari programlama modeline kuşbakışı baktığımızda aşağıdaki çizelge de görülen servis çeşitlerinin kullanımda olduğunu biliyoruz.</p>
<p><a href="https://buraksenyurt.com/pics/dsrp_1.png"><img style="display: inline;" title="dsrp_1" src="/pics/dsrp_1_thumb.png" alt="dsrp_1" width="542" height="360" /></a></p>
<p>Standart <strong>SOAP(Simple Object Access Protocol)</strong> servisleri<em>(klasik XML Web Service yaklaşımı olarak da düşünebiliriz)</em>, bügünlerde ASP.NET takımınca ele alınan ve <strong>Asp.Net</strong> <strong>Web API</strong> olarak adlandırılan <strong>HTTP</strong> bazlı <strong>REST(Representational State Transfer)</strong> modeli, özellikle <strong>veri odaklı(Data-Centric)</strong> çalışmak üzere tasarlanmış <strong>Entity Framework</strong> odaklı <strong>Data Service’</strong> ler, <strong>Silverlight</strong> tarafında kullanılan <strong>RIA(Rich Internet Application)</strong> çeşidi ve tabiki <strong>Workflow Foundation</strong> içerisinde yerini almış <strong>Workflow Service’</strong> ler.</p>
<p>Bu geniş servis yelpazesinin uygulandığı alanlar göz önüne alındığında, <strong>SQL Server, Sharepoint, BizTalk </strong>gibi pek çok ürün grubu işin içerisine giriyor ki buna bir de Cloud üzerindeki WCF uç noktalarını etkilediğimizde modelin ne kadar etkili bir alana yayıldığını daha iyi görebiliyoruz. Dolayısıyla <strong>WCF, </strong>etkisini pek çok noktadan pozitif anlamda hissettiriyor. Peki biz bu yazımızda neyi inceliyor olacağız? <img title="Smile" src="/editors/tiny_mce3/plugins/emotions/img/smiley-smile.gif" alt="Smile" border="0" /></p>
<p>Çoğunluka <strong>Entity Framework</strong> odaklı olarak kullanılan <strong>Data Service’</strong> ler, basit <strong>HTTP</strong> protokolü üzerinden, <strong>Querystring</strong> bazlı olacak şekilde içerik yayınlanmasına izin vermektedir. Bu anlamda <strong>HTTP</strong> protokolünün basit <strong>Get, Post, Put, Delete</strong> metodları ile çalışabilen, <strong>XML, JSON</strong> veya <strong>OData</strong> standardında <strong>Entity</strong> çıktılarını verebilen bir servis yapısı söz konusudur. Burada kafamıza takılan veya çok fazla ilişmediğimiz konulardan birisi ise,</p>
<blockquote>
<p>Data Service’ leri her zaman Entity Framework tabanlı olarak kullanmak zorunda olup olmadığımızdır?</p>
</blockquote>
<p>Güzel soru <img title="Sealed" src="/editors/tiny_mce3/plugins/emotions/img/smiley-sealed.gif" alt="Sealed" border="0" /> Acaba var olan <strong>Data Service</strong> çalışma modeli esnetilip <strong>Entity Framework</strong> yerine kendi <strong>veri sağlayıcılarımız(Provider)</strong> ile çalışabilir miyiz? Bir başka deyişle, örneğin <strong>ASP.NET </strong>üzerindeki <strong>Membership Provider, Profile Provider</strong> gibi yapılarda uygulanabilen özelleştirme mantığını, <strong>Data Service’</strong> ler tarafında da yapabilir miyiz? İşte bu yazımızda bu konuyu ele alıyor olacağız.</p>
<p>Olayı kolay ve hızlı bir şekilde kavrayabilmek adına İşe basit bir <strong>Console</strong> uygulaması açıp, çözüme aşağıdaki şekilde görülen <strong>.Net assembly’</strong> larını referans ederek başlamalıyız.</p>
<p><a href="https://buraksenyurt.com/pics/dsrp_3.png"><img style="display: inline;" title="dsrp_3" src="/pics/dsrp_3_thumb.png" alt="dsrp_3" width="249" height="436" /></a></p>
<p>Burada görüldüğü üzere uygulamamızda <strong>DataService</strong> tipini kullanarak bir <strong>Self-Host</strong> işlemi gerçekleştiriyor olacağız. Diğer yandan kendi <strong>provider’</strong> ımızı yazacağımız için de bazı <strong>assembly’</strong> lara ihtiyacımız var</p>
<ul>
<li>System.Data.Services</li>
<li>System.Data.Services.Client</li>
<li>System.ServiceModel</li>
<li>System.ServiceModel.Web</li>
</ul>
<p>Örnek uygulamamızda <strong>felsefeyi</strong> anlamaya odaklanacağımız için çok basit bir <strong>Text</strong> dosyasını veri kaynağı olarak kullanıyor olacağız. Bu text dosya içerisinde <strong>|</strong> işaretleri ile ayrılmış şekilde bir personel verisini tutmayı planlıyoruz. Personel numarası, adı, soyadı, ünvanı ve bulunduğu ülke örnek veri alanlarımız olarak düşünülebilir.</p>
<blockquote>
<p>Pek tabi çok daha farklı bir veri kaynağını da senaryoya dahil edebilirsiniz. Örneğin donanımsal bir arayüzün verilerini bu şekilde Data Service ‘ler üzerinden sunabileceğinizi düşünün. Söz gelimi bu bir mobil cihaz üzerinde bir süredir çalışmakta olan GPS servisinin topladığı içerik olabilir <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /></p>
</blockquote>
<p><a href="https://buraksenyurt.com/pics/dsrp_4.png"><img style="display: inline;" title="dsrp_4" src="/pics/dsrp_4_thumb.png" alt="dsrp_4" width="336" height="83" /></a> </p>
<p>Gelelim uygulamamız içerisindeki asıl kodlara. Önce <strong>Class Diagram’</strong> a bir bakalım.</p>
<p><a href="https://buraksenyurt.com/pics/dsrp_2.png"><img style="display: inline;" title="dsrp_2" src="/pics/dsrp_2_thumb.png" alt="dsrp_2" width="625" height="386" /></a></p>
<p><strong>Person</strong> sınıfı aslında bizim için <strong>POCO(Plain Old CLR Object)</strong> niteliği gösteren bir tip olarak düşünülebilir. Bu tipi, <strong>text</strong> dosya içerisindeki satırların nesnel karşılıklarını ifade etmek için kullanacağız.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System.Data.Services.Common;
namespace ReflectionProvider
{
[DataServiceKey("PersonId")]
public class Person
{
public int PersonId { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string Title { get; set; }
public string Country { get; set; }
}
}</pre>
<p>Tabi bu tip içerisinde sınıf seviyesinde uygulanan <strong>DataServiceKey</strong> niteliğine dikkat etmemiz gerekiyor. Bu nitelik ile <strong>Person</strong> tiplerinin <strong>Unique’</strong> liğini <strong>PersonId</strong> özelliklerine bağladığımızı ifade etmiş oluyoruz. Nitekim <strong>Data</strong> <strong>Service</strong> sınıfları, <strong>Entity Framework Entity</strong> tipleri ile çalışırken ilgili sınıflarda bu niteliğin kullanılmasını beklemektedir. Aynı davranışın burada da uyarlanması gerekmektedir. Gelelim <strong>Bag</strong> sınıfına.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
namespace ReflectionProvider
{
public class Bag
{
private static List<Person> persons = new List<Person>();
static Bag()
{
string[] personLines=File.ReadAllLines(ConfigurationManager.AppSettings["FilePath"]);
foreach (string personLine in personLines)
{
string[] columns=personLine.Split('|');
Person person = new Person();
person.PersonId = Int32.Parse(columns[0]);
person.Name = columns[1];
person.Surname = columns[2];
person.Title = columns[3];
person.Country = columns[4];
persons.Add(person);
}
}
public IQueryable<Person> Persons {
get
{
return persons.AsQueryable();
}
}
}
}</pre>
<p><strong>Bag</strong> sınıfı içerisinde <strong>text</strong> tabanlı dosya içeriğinin okunması ve <strong>Person</strong> tipinden <strong>generic</strong> bir <strong>List</strong> koleksiyonuna atanması işlemleri yapılmaktadır. Bu işlemler <strong>static</strong> <strong>yapıcı metod(Constructor)</strong> içerisinde gerçekleştirilmektedir. Diğer yandan sınıfın olabilecek belki de en önemli özelliği <strong>Persons</strong> üyesidir. Dikkat edileceği üzere bu üye geriye <strong>IQueryable<Person></strong> tipinden bir referans döndürmektedir. Bu sayede biz <strong>Data Service</strong> <strong>host</strong> ortamına, <strong>URL</strong> bazlı olarak sorgulanabilir bir içerik sağlayacağımızı da belirtmiş olacağız<em>(Bir başka deyişle <strong>EntitySet</strong> tipini ifade etmiş olmaktayız)</em> Tabi bu belirtme işlemini asıl <strong>DataService</strong> sınıfı içerisinde gerçekleştireceğiz. Aynen aşağıda olduğu gibi <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /></p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System.Data.Services;
namespace ReflectionProvider
{
public class BagDataService
:DataService<Bag>
{
public static void InitializeService(IDataServiceConfiguration configuration)
{
configuration.SetEntitySetAccessRule("Persons", EntitySetRights.All);
}
}
}</pre>
<p><strong>InitializeService</strong> metodu, servisi host edeceğimiz ortamda tetikleniyor olacak. Bu metod içerisinde standart <strong>Data</strong> <strong>Service</strong> şablonunda da yapıldığı gibi gerekli erişim kuralları belirlenmektedir. Tabi bu sefer <strong>Bag</strong> tipi içerisinde yer alan <strong>Persons</strong> isimli özellik için <strong>full</strong> erişim açılması söz konusudur. Bir başka deyişle <strong>GET, POST, PUT ve DELETE</strong> metodlarına hizmet edecektir. <em>(Ancak<strong> POST, PUT, DELETE</strong> gibi metod etkileşimleri için Bag tipine <strong>IUpdatable</strong> arayüzünün de uygulanması gerekmektedir ki bu yazımızda bu konu ele alınmamıştır. Bir sonraki yazımızda kısmetse)</em></p>
<p>Artık tek yapılması gereken <strong>DataService</strong> tipinden yararlanarak bir <strong>Host</strong> örneğini oluşturmak ve belirli bir <strong>URL</strong> üzerinden istemci taleplerini dinleyecek şekilde ayağa kaldırmaktan ibarettir. Bu amaçla <strong>Console</strong> uygulamamıza ait Main metodu içeriğini aşağıdaki gibi geliştirebiliriz.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.Data.Services;
namespace ReflectionProvider
{
class Program
{
static void Main(string[] args)
{
Type serviceType = typeof(BagDataService);
Uri baseAddress = new Uri("http://localhost:8080");
Uri[] baseAddresses = new Uri[] { baseAddress };
DataServiceHost host = new DataServiceHost(
serviceType,
baseAddresses);
host.Open();
Console.WriteLine("Host durumu {0}. Kapatmak için bir tuşa basın",host.State);
Console.ReadLine();
host.Close();
Console.WriteLine("Host duruumu {0}. Güle güle!",host.State);
}
}
}</pre>
<p>Şimdi buraya kadar yaptıklarımızı bir test edelim. İlk olarak <strong>Console</strong> uygulamamızı çalıştıralım. Sonrasında ise herhanbiri tarayıcı üzerinden uygulamamıza sorgulama talepleri gönderelim.</p>
<p>İlk sorgumuzda<strong> http://localhost:8080/Persons</strong> talebini deneyebiliriz.</p>
<p><img style="border-style: initial; border-color: initial;" src="/pics/2012%2f3%2fdsrp_6.png" alt="" /></p>
<p>Dikkat edileceği üzere <strong>Text </strong>dosyamız içerisinde yer alan tüm içerik <strong>XML </strong>formatında tarayıcı uygulamaya gelmiştir.</p>
<p>İkinci sorgumuzda ise belirli bir <strong>PersonId </strong>değerine sahip içeriği getirmeye çalışacağız. Hatırlayacağınız gibi <strong>Person </strong>tipine uyguladığımız <strong>DataServiceKey </strong>niteliği ile, <strong>PersonId </strong>özelliğinin <strong>unique </strong>anahtar olduğunu belirtmiştik. Bu amaçla <strong>http://localhost:8080/Persons(10002)</strong> URL' ini deneyebiliriz. İşte sonuç <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /></p>
<p><img src="/pics/2012%2f3%2fdsrp_7.png" alt="" /></p>
<p>Çok doğal olarak servise başka sorgular da gerçekleştirilebilir. Örneğin <strong>Country </strong>özelliğinin değerine göre alfabetik sırada listenin elde edilmesi sağlanabilir. Bunun için <strong>orderby </strong>anahtar kelimesini kullanmak yeterlidir. Tabi dikkat edilmesi gereken noktalardan birisi de, sorgu içerisinde yer alan özellik adlarının<strong> case-sensitive</strong> olarak ele alınması gerekliliğidir. Bir başka deyişle, <strong>Country </strong>yerine <strong>country </strong>yazmak hataya neden olacak ve bir sonuç kümesi döndürülmeyecektir. Dolayısıyla <strong>http://localhost:8080/Persons?$orderby=Country</strong> şeklindeki <strong>URL </strong>ifadesi aşağıdaki sonucun üretilmesini sağlayacaktır.</p>
<p><img src="/pics/2012%2f3%2fdsrp_8.png" alt="" /></p>
<p>Görüldüğü gibi <strong>WCF Data Service</strong>' lerde <strong>Reflection Provider</strong>' larını kullanarak <strong>Entity Framework</strong> dışındaki kaynakları kullanmak son derece kolaydır. Bu yazıda geliştirdiğimiz örnekte, <strong>POST, PUT </strong>ve <strong>DELETE </strong>sorguları için gerekli destek yoktur. Bunun için <strong>IUpdatable</strong> arayüzünün ve onunla birlikte tanımlanan üyelerin <strong>ezilmesi(override) </strong>gerekmektedir. Tekrardan görüşünceye dek hepinize mutlu günler dilerim <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /></p>
<p><a href="https://buraksenyurt.com/pics/2012%2f3%2fReflectionProvider.rar">ReflectionProvider.rar (36,11 kb)</a></p>2012-05-01T01:25:00+00:00wcfwcf data servicesreflection providerbsenyurtWindows Communication Foundation(WCF) yıllardır Microsoft mimarisinde önemli bir yere sahip. Özellikle servis bazlı uygulama geliştirme modeline kazandırdığı pek çok yeni yaklaşım sayesinde, var olan ve gelecek Microsoft ürünlerinin de pek çok noktasında kullanılmaya başlandı. Bana göre WCF modeli özellikle 3.5 sürümü ile başlayan gelişmeler ile birlikte programlama modelini önemli derece de geliştirdi. Bu gün mimari programlama modeline kuşbakışı baktığımızda aşağıdaki çizelge de görülen servis çeşitlerinin kullanımda olduğunu biliyoruz.https://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=45cc8161-4386-4613-bf2f-e4035b2608723https://buraksenyurt.com/trackback.axd?id=45cc8161-4386-4613-bf2f-e4035b260872https://buraksenyurt.com/post/WCF-Data-Services-Reflection-Provider#commenthttps://buraksenyurt.com/syndication.axd?post=45cc8161-4386-4613-bf2f-e4035b260872https://buraksenyurt.com/post/WCF-Data-Servicese28093-Annotations-BuilderWCF Data Services– Annotations Builder2011-10-14T14:00:00+00:00bsenyurt<p><a href="https://buraksenyurt.com/pics/Huzun.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="Huzun" src="/pics/Huzun_thumb.jpg" alt="Huzun" width="240" height="161" align="right" border="0" /></a>Merhaba Arkadaşlar,</p>
<p>Yağmurlu bu sonbahar günlerinde eminim ki kimse hüzünlenmek, kara kara düşünmek istemez. Ama bazen o kadar garip sorunlar ile karşı karşıya kalırız ki…Ne yapacağımızı bilemeyiz ve kara kara düşünürüz. Mesela ben bu girişi yazdığım sırada, aslında tamamlamış olduğum makalenin sonucunda bir yere varamamış ve beklentilerimi karşılayamamış birisi modundayım. Neden mi? Gelin anlatayım.</p>
<p>Gün geçmiyor ki <strong>Microsoft</strong> ürünlerinde yeni bir sürüm, yeni bir güncelleme görmeyelim <img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="/pics/wlEmoticon-smile_18.png" alt="Gülümseme" /> Şurada daha iki gün oldu<strong> Entity Framework 4.2 RC</strong> ile ilişkili bir şeyler yazmaya çalışmıştım. Bu gün de ne duyduk dersiniz? <a href="http://www.microsoft.com/download/en/details.aspx?id=27728">WCF Data Services October 2011 CTP</a> yayınlanmış <img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="/pics/wlEmoticon-smile_18.png" alt="Gülümseme" /> Biraz sitemkar bir giriş oldu ama boşverin…</p>
<p>Çok doğal olarak hemen arkasında söz konusu yeni <strong>CTP</strong> ile ilişkili ilk blog girişleri de <strong>Team Blog</strong> üzerinden yayınlanmaya başladı. Ben de bunun üzerine gelen yeniliklerden birisi olan <strong>Vocabularies</strong> kavramını özellikle getirildiği Annotations yapısı ile birlikte incelemeye ve anlamaya çalıştım. Dilerseniz yine tümden gelimden hareket edelim ve önce senaryomuzu geliştirip sonunda elde ettiğimiz<em>(ve hatta elde edemediğimiz)</em> bulguları değerlendirelim. <em>(Bundan sonraki kısımda daha önceden <strong>WCF Data Service</strong> ile geliştirme yaptığınızı ve biraz aşina olduğunuzu varsayarak ilerleyeceğim)</em></p>
<p>Tabi ilk olarak <a href="http://www.microsoft.com/download/en/details.aspx?id=27728">WCF Data Services October 2011 CTP</a> adresinden son sürümü indirmeniz gerekiyor. Bunu yaptığımız takdirde <strong>Visual Studio 2010</strong> ortamına aşağıdaki ekran görüntüsünde yer alan yeni bir proje öğesinin eklendiğini görebiliriz.</p>
<p><a href="https://buraksenyurt.com/pics/bei_25.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="bei_25" src="/pics/bei_25_thumb.gif" alt="bei_25" width="472" height="109" border="0" /></a></p>
<p>Bildiğiniz üzere <strong>WCF Data Service’</strong> ler veri odaklı çalışan, <strong>HTTP</strong> protokolünün <strong>GET,POST,PUT,DELETE</strong> metodlarına cevap verebilen ve günümüzde <strong>OData</strong> formatına da destek sağlayan özelleştirilmiş <strong>WCF(Windows Communication Foundation)</strong> Servisleridir. <strong>Data Centric</strong> özellikleri nedeniyle de genellikle <strong>Ado.Net Entity Framework</strong> tabanlı ORM modelleri üzerinden sunulmaktadırlar. Bu nedenle örnek uygulamamızda çok basit olarak <strong>AdventureWorks</strong> veritabanındaki <strong>Product</strong> tablosunu modelleyen bir <strong>Entity Data Model</strong> olduğunu düşünerek ilerleyeceğiz. Söz konusu ekleme işlemi sonrasında Web uygulamamıza dahil edeceğimiz <strong>WCF DataService OCT 2011 CTP</strong> öğesinin kod içeriğini de aşağıdaki gibi geliştirebiliriz.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System.Collections.Generic;
using System.Data.Services;
using System.Data.Services.Common;
using System.Xml;
using Microsoft.Data.Edm;
using Microsoft.Data.Edm.Csdl;
using Microsoft.Data.Edm.Validation;
namespace AdventureWorksDataServices
{
public class ProductDataService
: DataService<AdventureWorksEntities>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("Products", EntitySetRights.All);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
config.AnnotationsBuilder = (model) =>
{
IEdmModel edmModel;
IEnumerable<EdmError> errors;
XmlReader[] readers =new XmlReader[] {
XmlReader.Create("f:\\ProductsAnnotations.xml")
};
bool parsed = CsdlReader.TryParse(readers, out edmModel, out errors, model);
return parsed ? new IEdmModel[] { edmModel } : null;
};
}
}
}</pre>
<p>Piuvvvv <img class="wlEmoticon wlEmoticon-confusedsmile" style="border-style: none;" src="/pics/wlEmoticon-confusedsmile_9.png" alt="Kafası karışmış gülümseme" /> Burada neler oldu böyle? Daha önceden yaptığımız <strong>Ado.Net Data Service</strong> geliştirmelerine hiç ama hiç benzemiyor gibi. Daha önceden sadece ilgili <strong>Entity</strong> tiplerini belirli erişim kuralları çerçevesinde<em>(Örneğin sadece okuma amaçı açılsınlar) </em>dış dünyaya açan bir <strong>InitializeService</strong> metodu bulunurdu aslında <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="/pics/wlEmoticon-winkingsmile_69.png" alt="Göz kırpan gülümseme" /> Aslında olayı kısaca açıklayayım.</p>
<p><strong>DataServiceConfiguration</strong> tipine eklenen yeni <strong>AnnotationsBuilder</strong> özelliği aslında</p>
<p><strong>public Func<Microsoft.Data.Edm.IEdmModel, IEnumerable<Microsoft.Data.Edm.IEdmModel>></strong> <strong>AnnotationsBuilder</strong></p>
<p>ile işaret edilen bir metodu göstermektedir. Bu metod içerisinde biz, <strong>Entity Data Model’</strong> in <strong>CSDL(Conceptual Schema Definition Language)</strong> içeriğine müdahale ederek örnek bazı değişikliklerde bulunuyoruz. Bu değişiklikler koda göre XmlReader yardımıyla okunan <strong>ProductsAnnotations.xml</strong> isimli dosyada yer almaktadır. Dikkat edecek olursak eğer <strong>CsdlReader</strong> tipinin <strong>TryParse</strong> metodu bir den fazla <strong>XmlReader</strong> referansı alabilmektedir. Bir başka deyişle bir <strong>CSDL</strong> içeriğine <strong>n adet Annotation</strong> kuralının enjekte edilmesi de mümkündür. Örneğimizde kullandığımız dosya içeriği ise aşağıdaki gibidir.</p>
<pre class="brush:xml;auto-links:false;toolbar:false" contenteditable="false"><Schema Namespace="AdventureWorksModel" Alias="AdventureWorksModel" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
<Using NamespaceUri="http://vocabularies.odata.org/Validation" Alias="Validation"/>
<Annotations Target="AdventureWorksModel.Product.ListPrice">
<TypeAnnotation Term="Validation.Range">
<PropertyValue Property="Min" Decimal="0" />
<PropertyValue Property="Max" Decimal="5000" />
</TypeAnnotation>
</Annotations>
</Schema></pre>
<p>Burada son <strong>CTP</strong> ile gelen önemli bir nokta <strong>Using</strong> elementi ve içerisindeki <strong>NamespaceUri</strong> niteliğinin değeridir. Bu detaylar bir kenara dursun aslında bu dosyanın ne söylediğini anlamak şu anda bizim için çok daha önemlidir <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="/pics/wlEmoticon-winkingsmile_69.png" alt="Göz kırpan gülümseme" /> </p>
<p>Dikkat edileceği üzere <strong>Annotations</strong> elementine ait <strong>Target</strong> niteliğinde bir tanımlama yapılmıştır. Buna göre <strong>AdventureWorksModel</strong> şemasında yer alan <strong>Product Entity tipinin</strong> <strong>ListPrice</strong> özelliği için <strong>Validation.Range</strong> formatında bir <strong>TypeAnnotation</strong> bildirimi yapılmaktadır. Bir başka deyişle <strong>ListPrice</strong> özelliği için çalışma zamanında üretilen <strong>metadata</strong> içeriğine enjekte edilecek bir doğrulama kalıbı sunulmaktadır.</p>
<p>Bu kalıba göre <strong>ListPrice</strong> özelliğinin <strong>Decimal</strong> veri tipinden olan <strong>minimum</strong> ve <strong>maximum</strong> alan değerleri belirtilmektedir. Senaryomuza göre <strong>ListPrice</strong> özelliği<strong> 0 ile 5000 birim arasında</strong> olmalıdır. İşte kod tarafında kullanılan <strong>TryParse</strong> metodu eğer <strong>XML</strong> dosyasını okuyabilme işlemi başarılı olursa, ilgili validasyonu çalışma zamanındaki metadata içeriğine dahil edecektir. Eğer<strong> Data Service</strong> örneği herhangibir tarayıcıda açılır ve <strong>metadata</strong> içeriğine ulaşılırsa aşağıdaki çıktı ile karşılaşıldığı görülecektir. <em>(Benim örneğimde söz konusu Data Service adresi </em><a title="http://localhost:4860/ProductDataService.svc/$metadata" href="http://localhost:4860/ProductDataService.svc/$metadata"><em>http://localhost:4860/ProductDataService.svc/$metadata</em></a><em> şeklindedir)</em></p>
<p><a href="https://buraksenyurt.com/pics/bei_27.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="bei_27" src="/pics/bei_27_thumb.gif" alt="bei_27" width="572" height="564" border="0" /></a></p>
<p><img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="/pics/wlEmoticon-smile_18.png" alt="Gülümseme" /> </p>
<p>Bakın burası çok önemli. Bir <strong>WCF Data Service’</strong> in çalışma zamanındaki <strong>metadata</strong> çıktısına bir doğrulama kuralı enjekte edilmektedir.<em> (Bu tip bir çalışma zamanı alt yapısını sıfırdan nasıl yazabileceğinizi, hangi tasarım kalıplarına veya yazılım prensiplerine ihtiyacınız olacağını bir düşünün <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="/pics/wlEmoticon-winkingsmile_69.png" alt="Göz kırpan gülümseme" /> )</em></p>
<p>Peki ama bu ne işimize yarayacak? Bunun için öncelikli olarak basit bir Client uygulaması geliştirmeyi düşünebiliriz. <strong>Console Application</strong> şeklinde tasarlayabileceğimiz bu uygulama çok basit olarak ilgili <strong>WCF Data Service’</strong> i referans etmelidir. Sonrasında test amacıyla herhangibir <strong>Product</strong> nesne örneğinin <strong>ListPrice</strong> özelliğinin değeri <strong>0-5000</strong> aralığı dışında <strong>set</strong> edilerek nasıl bir sonuç elde edildiğine bakılabilir. Ben bu amaçla istemci tarafına ilgili servis referansını eklemeye çalışarak işe başladım. İşe başladım diyorum çünkü <strong>Visual Studio 2010’</strong> a ait <strong>Add Service Reference</strong> ekleme aracı bir <strong>Namespace</strong>’ i bulamadığı için söz konusu <strong>proxy</strong> tipini üretmeyi başaramadı <img class="wlEmoticon wlEmoticon-sadsmile" style="border-style: none;" src="/pics/wlEmoticon-sadsmile_7.png" alt="Üzgün gülümseme" /></p>
<p><a href="https://buraksenyurt.com/pics/bei_28.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="bei_28" src="/pics/bei_28_thumb.gif" alt="bei_28" width="496" height="184" border="0" /></a></p>
<p>Ben de bunun üstüne söz konusu servis referansını komut satırından <strong>DataSvcUtil</strong> aracı ile üretmeyi denedim. İşte sonuç <img class="wlEmoticon wlEmoticon-sadsmile" style="border-style: none;" src="/pics/wlEmoticon-sadsmile_7.png" alt="Üzgün gülümseme" /></p>
<p><a href="https://buraksenyurt.com/pics/bei_29.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="bei_29" src="/pics/bei_29_thumb.gif" alt="bei_29" width="640" height="176" border="0" /></a></p>
<p>Hal böyle olunca tabi heyecanlı bir şekilde makaleyi yazmaya çalışan bir yazılım sevdalısının nasıl da hüsrana uğradığını zannediyorum ki anlayabilirsiniz <img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="/pics/wlEmoticon-smile_18.png" alt="Gülümseme" /> Eğer <strong>Proxy</strong> üretimi başarılı bir şekilde gerçekleşseydi bu durumda aşağıdaki ilüsturasyon da yer alan bir kod parçasını denemeye tabi tutacaktık.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.Linq;
using ConsoleApp.AdventureWorks;
namespace ClientApp
{
class Program
{
static void Main(string[] args)
{
AdventureWorksEntities works = new AdventureWorksEntities(new Uri("http://localhost:4860/ProductDataService.svc"));
var product = (from p in works.Products
where p.ProductID == 1
select p).FirstOrDefault();
if (product != null)
{
product.ListPrice = 5001M;
}
works.UpdateObject(product);
var response = works.SaveChanges();
}
}
}</pre>
<p>ve özellikle örnek bir <strong>Product</strong> nesne örneğinin <strong>ListPrice</strong> özelliğinin değerini, <strong>Annotations’</strong> da belirttiğimiz aralığın dışına çıkartmaya çalışacak ve <strong>SaveChanges</strong> çağrısı sonucu servis tarafından gelen <strong>Response’</strong> a bakacaktık. Bu noktada tahmin edeceğiniz üzere beklentimiz validasyon ihlali nedeniyle <strong>Update</strong> işleminin yapılmaması ve buna uygun bir Response kodunun istemci tarafında döndürülmesi olacaktı. En azından benim beklentim bu yöndeydi.</p>
<p>Yine de buraya kadar yazdıklarımız ile aslında <strong>WCF Data Service</strong> tarafındaki <strong>Annotations</strong> bildirimlerinin, yeni <strong>CTP</strong> sürümü ile gelen <strong>Vocabularies</strong> <strong>namespace’</strong> i ile ilişkilendirildiğini düşünebiliriz. Amaç ise <strong>Entity, Property, Navigation Property</strong> gibi bazı yapılarda doğrulama kurallarını uygulatabilmektir. Bu konu ile ilişkili olarak ben de <a href="http://blogs.msdn.com/b/astoriateam/archive/2011/10/13/vocabularies-in-wcf-data-services.aspx">şu adresteki</a> girdiye ait yorumları takip etmeye çalışıyor olacağım. Malum istemci tarafı için gerekli bir testi gerçekleştiremedik/gerçekleştiremedim. Dolayısıyla şimdilik yazımızı sonlandırmak durumundayız. Buruk bir son oldu ama ne yapalım.<img class="wlEmoticon wlEmoticon-sadsmile" style="border-style: none;" src="/pics/wlEmoticon-sadsmile_7.png" alt="Üzgün gülümseme" /> Tekrardan görüşünceye dek hepinize mutlu günler dilerim.</p>2011-10-14T14:00:00+00:00wcf data servicesastoriawcfannotationswcf data services october 2011 ctpbsenyurtGün geçmiyor ki Microsoft ürünlerinde yeni bir sürüm, yeni bir güncelleme görmeyelim Gülümseme Şurada daha iki gün oldu Entity Framework 4.2 RC ile ilişkili bir şeyler yazmaya çalışmıştım. Bu gün de ne duyduk dersiniz? WCF Data Services October 2011 CTP yayınlanmış Gülümseme Biraz sitemkar bir giriş oldu ama boşverin…https://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=3401577d-0110-4fd6-ae73-adf95c8d58210https://buraksenyurt.com/trackback.axd?id=3401577d-0110-4fd6-ae73-adf95c8d5821https://buraksenyurt.com/post/WCF-Data-Servicese28093-Annotations-Builder#commenthttps://buraksenyurt.com/syndication.axd?post=3401577d-0110-4fd6-ae73-adf95c8d5821https://buraksenyurt.com/post/Microsoft-PDC-Icerigini-OData-Servisi-Uzerinden-Elde-EtmekMicrosoft PDC İçeriğini OData Servisi Üzerinden Elde Etmek2010-11-17T22:18:00+00:00bsenyurt<p><a href="https://buraksenyurt.com/pics/blg240_Giris.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; padding-top: 0px; border: 0px;" title="blg240_Giris" src="/pics/blg240_Giris_thumb.gif" alt="blg240_Giris" width="320" height="215" align="right" border="0" /></a>Merhaba Arkadaşlar,</p>
<p>Bildiğiniz üzere bir süre önce <strong>Microsoft PDC 2010</strong> etkinlikleri gerçekleştirildi. Online olaraktan da canlı izleyebildiğimiz sunumlarda <strong>Microsoft’</strong> un çok değerli sunumlarına ve anlatımlarına şahit olduk. Her <strong>PDC</strong> konferansında olduğu gibi bu sene yapılan etkinliklere ait görüntü kayıtları, <strong>Download</strong> edilmeye açıldıkları andan itibaren de ilgi odağı oldular<img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="/pics/wlEmoticon-winkingsmile_10.png" alt="Winking smile" /> </p>
<p>İlginç olan noktalardan birisi ise, <strong>PDC’</strong> de sunulan içeriklerin ve detaylı bilgilerinin<strong> Open Data Protocol(ODATA)</strong> formatında ve bir <strong>WCF Data Service</strong> aracılığıyla dış dünyaya sunuluyor olmasıydı.</p>
<p>Aslına bakarsanız bu tip bir veri paylaşımı benim gibi servis tarafı ile ilgilenen pek çok geliştirici için tek bir anlama gelmektedir : <strong>“Git kendi uygulamanı yaz ve PDC Session bilgilerini servis aracılığıyla çek”</strong> <img class="wlEmoticon wlEmoticon-openmouthedsmile" style="border-style: none;" src="/pics/wlEmoticon-openmouthedsmile_8.png" alt="Open-mouthed smile" /> İşte Kurban bayramının ortasında olduğumuz şu günlerde ele aldığımız blog yazımızın konusu da bu olacak.</p>
<p>İlk olarak <strong>PDC 2010’</strong> a ait bilgilerin nereden yayınlandığına bakarak başlamamızda yarar olacağı kanısındayım. Şu an itibariyle <a title="http://odata.microsoftpdc.com/ODataSchedule.svc/" href="http://odata.microsoftpdc.com/ODataSchedule.svc/">http://odata.microsoftpdc.com/ODataSchedule.svc/</a> adresinden bir paylaşım yapılmaktadır. Hatta her hangibir tarayıcı uygulaması ile baktığımızda aşağıdaki <strong>Atom</strong> veri içeriğinin üretildiğini görebiliriz.</p>
<p><a href="https://buraksenyurt.com/pics/blg240_Browser.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="blg240_Browser" src="/pics/blg240_Browser_thumb.gif" alt="blg240_Browser" width="572" height="569" border="0" /></a></p>
<p>Servis tarafından çekilen bu içerik sanıyorum ki <strong>WCF Data Service</strong> geliştiren veya kullananlara tanıdık gelecektir. Aslında bir anlamda tarayıcı üzerinden sorgulanabilir veri içeriğinin söz konusu olduğunu ifade edebiliriz. Söz gelimi</p>
<p><a title="http://odata.microsoftpdc.com/ODataSchedule.svc/Sessions?$select=ShortTitle,ShortUrl,FullDescription,Tags&$orderby=ShortTitle" href="http://odata.microsoftpdc.com/ODataSchedule.svc/Sessions?$select=ShortTitle,ShortUrl,FullDescription,Tags&$orderby=ShortTitle">http://odata.microsoftpdc.com/ODataSchedule.svc/Sessions?$select=ShortTitle,ShortUrl,FullDescription,Tags&$orderby=ShortTitle</a></p>
<p>şeklinde bir URL sorgulamasının sonucu olarak <strong>ShortTitle, ShortUrl, FullDescription</strong> ve <strong>Tags</strong> bilgilerinden oluşan, ayrıca <strong>ShortTitle</strong> içeriğine göre <strong>A’ dan Z’ ye sıralı</strong> olarak gelen bir listeyi elde ederiz. Aynen aşağıdaki ekran görüntüsünde olduğu gibi.</p>
<p><a href="https://buraksenyurt.com/pics/blg240_SampleQuery.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="blg240_SampleQuery" src="/pics/blg240_SampleQuery_thumb.gif" alt="blg240_SampleQuery" width="585" height="682" border="0" /></a></p>
<p>Dikkat edileceği üzere gerçekleştirilen oturumlara ait detaylı bilgileri bu servis üzerinden tedarik edebiliriz. Söz gelimi <strong>Download</strong> edilebilir materyallere ait bağlantı adreslerini<em>(Powerpoint Sunumlar, WMV ve MP4 dosyaları)</em>, konuşmacılara ait kısa öz geçmişleri, oturumlar ile ilişkili başlık, açıklama, kategori ve daha pek çok bilgiyi elde etme şansına sahibiz. Yazıyı hazırlarkenki ilk amacımız <strong>Download edilebilir içeriklere ulaşmaktır.</strong> Bunun için <strong>Sessions</strong> koleksiyonundan yararlanmamız yeterli olacaktır. Ancak tabiki de diğer<strong> Entity Set</strong> içeriklerini de değerlendirip çok daha detaylı bir arayüz uygulaması geliştirebilirsiniz <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="/pics/wlEmoticon-winkingsmile_10.png" alt="Winking smile" /> <em>(Hatta sıkı takipçilerinden olduğum<strong> Mike Taulty’</strong> nin daha geçen günlerde <a href="http://feedproxy.google.com/~r/mtaulty/~3/xQwMPWbDX9w/pdc-2010-session-downloader-in-silverlight.aspx" target="_blank">yayınlamış</a> olduğu oldukça iddiali bir Silverlight uygulaması da söz konusudur)</em></p>
<p>Örneği bir Web uygulaması olarak geliştirebiliriz. <em>(Web uygulamasını tercih etmemin en büyük sebeplerinden birisi de, Download Link’ lerine doğal destek verecek olmasıdır)</em> İlk etapta <strong>PDC</strong> için geliştirilmiş <strong>WCF Data Service’</strong> inin projeye referans edilmesi gerekmektedir. Aynen aşağıdaki ekran görüntüsünde olduğu gibi.</p>
<p><a href="https://buraksenyurt.com/pics/blg240_AddSrvRef.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="blg240_AddSrvRef" src="/pics/blg240_AddSrvRef_thumb.gif" alt="blg240_AddSrvRef" width="631" height="546" border="0" /></a></p>
<p>Dikkat edileceği üzere servis tarafından <strong>ScheduleModel</strong> isimli bir <strong>Context</strong> tipi getirilmektedir.<strong> PDC </strong>isimli<strong> namespace</strong> altında yer alacak <strong>Proxy</strong> bileşeninin üretimi sonucu <strong>Solution</strong> içerisine açılan tiplerin sınıf diagramı görüntüsü de aşağıdaki gibi olacaktır.</p>
<p><a href="https://buraksenyurt.com/pics/blg240_ClassDiagram.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="blg240_ClassDiagram" src="/pics/blg240_ClassDiagram_thumb.gif" alt="blg240_ClassDiagram" width="478" height="523" border="0" /></a></p>
<p><strong>DataServiceContext</strong> türevli olan <strong>ScheduleModel</strong> içerisinden standart <strong>LINQ(Language INtegrated Query)</strong> sorgularını kullanarak ilerleyebilir ve özellikle <strong>Sessions</strong> özelliği ile ifade edilen koleksiyon içeriğini ele alabiliriz. Bu andan itibaren kodlama tarafında farklı şekillerde ilerlememiz de mümkündür. Söz gelimi istediğimiz veri içeriklerini bir <strong>Web User Control</strong> üzerinde toplayabilir veya <strong>GridView</strong> gibi veri-bağlı kontrollerden birisine servis yardımıyla çekebiliriz.</p>
<p>Biz örneğimizde Web User Control tipini kullanarak ilerlemeye gayret edeceğiz. Hatta iki adet<strong> Web User Control</strong> tasarlayacağımızı ifade edebilirim. Bunlardan birisi <strong>Sessions</strong> ile ilişkili <strong>Title, Description,Tags, Thumbnail Photo</strong> bilgilerini taşıyor olacak. Diğer kontrolümüz ise <strong>Download</strong> edilebilir içeriğe ait <strong>Title</strong> ve en önemlisi de indirme işlemi için gerekli bağlantı bilgilerini barındırıyor olacak. İşte <strong>SessionInfo</strong> isimli ilk <strong>ascx</strong> bileşenimiz.</p>
<p>SessionInfo.ascx</p>
<pre class="brush:html;auto-links:false;toolbar:false" contenteditable="false"><%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SessionInfo.ascx.cs" Inherits="PDC2010.SessionInfo" %>
<style type="text/css">
.style1
{
width: 100%;
}
.style3
{
width: 84px;
font-weight: bold;
}
</style>
<table cellpadding="3" cellspacing="1" class="style1" frame="box"
style="font-size: small">
<tr>
<td class="style3" rowspan="4" valign="top">
<asp:Image ID="imageThumbnailPhoto" runat="server" />
</td>
<td class="style3">
Title</td>
<td>
<asp:Label ID="labelTitle" runat="server" ForeColor="#FF3300" Text="Label"></asp:Label>
</td>
</tr>
<tr>
<td class="style3">
Description</td>
<td>
<asp:Label ID="labelDescription" runat="server" Text="Label"></asp:Label>
</td>
</tr>
<tr>
<td class="style3" valign="top">
Tags</td>
<td>
<asp:Label ID="labelTags" runat="server" ForeColor="#999966" Text="Label"></asp:Label>
</td>
</tr>
<tr>
<td class="style3" valign="top">
Downloads</td>
<td>
<asp:PlaceHolder ID="holderLinks" runat="server"></asp:PlaceHolder>
</td>
</tr>
</table></pre>
<p><strong>ve kod</strong></p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System.Web.UI.WebControls;
namespace PDC2010
{
public partial class SessionInfo
: System.Web.UI.UserControl
{
public string Title
{
set { labelTitle.Text = value; }
}
public string Description
{
set { labelDescription.Text = value; }
}
public string ThumbnailLink
{
set { imageThumbnailPhoto.ImageUrl = value; }
}
public string Tags
{
set { labelTags.Text = value; }
}
public PlaceHolder LinkHolder
{
get{return holderLinks;}
}
}
}</pre>
<p><strong>SessionInfo</strong> kontrolü içerisinde <strong>Title, Description, Tags</strong> bilgilerini tuttuğumuz <strong>Label</strong> bileşenlerinin <strong>Text</strong> değerlerine erişmek için bir kaç <strong>Property</strong> kullanılmaktadır. Bununla birlikte <strong>Thumbnail</strong> resmi için de bir <strong>Image</strong> kontrolü kullanılmakta ve bu kontrolün <strong>ImageUrl </strong>özelliğine <strong>ThumbnailLink</strong> üzerinden değer atanması sağlanmaktadır.</p>
<p>Her bir <strong>Session</strong> için <strong>n</strong> sayıda <strong>Download</strong> <strong>Link</strong> söz konusu olabilir. MP4, WMV gibi formatlardaki içeriklere ait bağlantı bilgileri <strong>Content Entity</strong> tipi üzerinde tutulmaktadır. Bu bilgilere erişildikten sonra yine bir <strong>Web User Control</strong> bileşeninden yararlanılmakta ve söz konusu bileşene ait çalışma zamanı kontrol örnekleri, <strong>LinkHolder</strong> özelliği ile, <strong>SessionInfo</strong> üzerindeki <strong>PlaceHolder</strong> bileşeninin <strong>Controls</strong> koleksiyonuna eklenmektedir. <strong>ContentLink</strong> olarak adlandırdığımız bu bileşenin içeriği ise aşağıdaki gibidir.</p>
<pre class="brush:html;auto-links:false;toolbar:false" contenteditable="false"><%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ContentLink.ascx.cs" Inherits="PDC2010.ContentLink" %>
<style type="text/css">
.style1
{
width: 100%;
}
.style2
{}
.style6
{
font-style: italic;
font-weight: bold;
width: 78px;
}
.style7
{
width: 87%;
}
</style>
<table cellpadding="3" cellspacing="1" class="style1">
<tr>
<td class="style6">
Title</td>
<td class="style7">
<i>
<asp:Label ID="labelTitle" runat="server" Text="Label"></asp:Label>
</i>
</td>
</tr>
<tr>
<td class="style2" colspan="2">
<asp:HyperLink ID="linkDownloadUrl" runat="server">Download</asp:HyperLink>
</td>
</tr>
</table></pre>
<p><strong>ve kod içeriği;</strong></p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
namespace PDC2010
{
public partial class ContentLink : System.Web.UI.UserControl
{
public string Title
{
set { labelTitle.Text = value; }
}
public string Url
{
set {linkDownloadUrl.NavigateUrl= value;}
}
}
}</pre>
<p>Görüldüğü üzere ContentLink bileşeni üzerinde <strong>Title</strong> ve <strong>Url</strong> bilgileri tutulmakta olup bunların ilgili özelliklerine erişim için yine <strong>Property’</strong> lerden yararlanılmaktadır.</p>
<p>Bu kontroller sayesinde <strong>WCF Data Service</strong> tarafına gönderilen <strong>LINQ</strong> sorguları sonrası yüklenecek olan veri içeriklerinin, görsel bileşen bazındaki karşılıkları da tasarlanmış olmaktadır. Artık <strong>Default.aspx</strong> sayfasının tasarımsal ve kodsal içeriğini kodlayabiliriz <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="/pics/wlEmoticon-winkingsmile_10.png" alt="Winking smile" /></p>
<p><strong>Default.aspx içeriği;</strong></p>
<pre class="brush:html;auto-links:false;toolbar:false" contenteditable="false"><%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
CodeBehind="Default.aspx.cs" Inherits="PDC2010._Default" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>
Microsoft PDC 2010
</h2>
<p>
<asp:PlaceHolder ID="holderSessions" runat="server"></asp:PlaceHolder>
</p>
</asp:Content></pre>
<p><strong>kod kısmı;</strong></p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.Linq;
using PDC2010.PDC;
namespace PDC2010
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ScheduleModel model = new ScheduleModel(new Uri("http://odata.microsoftpdc.com/ODataSchedule.svc/"));
var sessions = from p in model.Sessions
orderby p.FullTitle
select new
{
p.FullTitle,
p.FullDescription,
p.Tags,
p.ThumbnailUrl,
p.DownloadableContent
};
foreach (var s in sessions)
{
SessionInfo sInfo=LoadControl("~/SessionInfo.ascx") as SessionInfo;
sInfo.Title = s.FullTitle;
sInfo.Description = s.FullDescription;
sInfo.ThumbnailLink = s.ThumbnailUrl;
sInfo.Tags = s.Tags;
if (s.DownloadableContent.Count > 0)
{
foreach (var c in s.DownloadableContent)
{
ContentLink cLink = LoadControl("/ContentLink.ascx") as ContentLink;
cLink.Title = c.Title;
cLink.Url = c.Url;
sInfo.LinkHolder.Controls.Add(cLink);
}
}
holderSessions.Controls.Add(sInfo);
}
}
}
}</pre>
<p>İlk olarak <strong>ScheduleModule</strong> tipine ait bir nesne örneği oluşturulduğu görülmektedir ki <strong>yapıcı metodu(Constructor)</strong> parametre olarak <strong>WCF Data Service</strong> adresini almaktadır. Sonrasında standart bir <strong>LINQ</strong> sorgusu yazılmış ve <strong>Sessions Entity</strong> içeriğine gidilerek bazı bilgilerin alınması ve bunların bir <strong>anonymous type(İsimsiz Tip)</strong> içerisinde birleştirilmesi sağlanmıştır. Bu akılcı bir yaklaşımdır nitekim Sessions tipi içerisindeki tüm özelliklere ihtiyacımız yoktur <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="/pics/wlEmoticon-winkingsmile_10.png" alt="Winking smile" /></p>
<p>Her bir <strong>Sessions</strong> nesne örneği üzerinden <strong>DownloadableContent</strong> özelliğine giderek indirilebilir içerik bilgilerinin <strong>Title</strong> ve <strong>Url</strong> bilgilerine ulaşılmaktadır. Elbette her bir <strong>Sessions</strong> nesne örneği için bu işlem söz konusudur. Her bir <strong>Sessions</strong> için bir <strong>SessionInfo</strong> <strong>Web User Control</strong> nesnesi örneklenirken, her bir <strong>Content</strong> nesne örneği için de <strong>ContentLink</strong> <strong>Web User Control’</strong> üne ait örneklemeler yapılmakta ve sayfaya eklenmeleri sağlanmaktadır.</p>
<p>Çok doğal olarak sayfaya ait <strong>Load</strong> metodunda yaptığımız bu işlemler bir kaç saniyelik zaman kaybına neden olacaktır. Burada servisten verinin alınıp indirilmesi ve işlenmesi, süre kaybına neden olan etkenlerin başında gelmektedir. Dolayısıyla <strong>asenkron</strong> olarak verinin yüklenmesi ve hatta <strong>AJAX</strong> tabanlı bir <strong>Web Control</strong> içerisinde bu yükleme işleminin yapılması çok daha doğru bir yaklaşımdır. Bu kritik noktayı bir kenara bırakıp uygulamamızı çalıştırdığımızda ise aşağıdaki ekran görüntüsündekine benzer sonuçlar ile karşılaştığımızı görürüz.</p>
<p><a href="https://buraksenyurt.com/pics/blg240_Result.gif"><img style="background-image: none; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="blg240_Result" src="/pics/blg240_Result_thumb.gif" alt="blg240_Result" width="627" height="480" border="0" /></a></p>
<p>Bu noktada dilerseniz <strong>Windows</strong> veya <strong>WPF</strong> tabanlı bir <strong>Desktop</strong> uygulaması ya da <strong>Silverlight</strong> tabanlı bir <strong>Rich Internet Application</strong>’ da geliştirebilirsiniz. Servis dünyasını seviyorum <img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="/pics/wlEmoticon-smile_2.png" alt="Smile" /> Bu yazıda ele aldığımız <strong>PDC</strong> servisinin <strong>OData</strong> formatında veri içeriği sunuyor olması sayesinde tamamen platform bağımsız istemciler geliştirebilir ve tüm <strong>PDC</strong> içeriğini bu uygulamalar üzerinde değerlendirebiliriz. Ben kapıyı gösterdim, geçecek olan sizsiniz <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="/pics/wlEmoticon-winkingsmile_10.png" alt="Winking smile" /> Tekrardan görüşünceye dek hepinize mutlu günler dilerim.</p>
<p><a href="https://buraksenyurt.com/pics/2010%2f11%2fPDC2010.rar">PDC2010.rar (200,14 kb)</a></p>2010-11-17T22:18:00+00:00wcfodatawcf data servicesopen data protocolbsenyurtBildiğiniz üzere bir süre önce Microsoft PDC 2010 etkinlikleri gerçekleştirildi. Online olaraktan da canlı izleyebildiğimiz sunumlarda Microsoft’ un çok değerli sunumlarına ve anlatımlarına şahit olduk. Her PDC konferansında olduğu gibi bu sene yapılan etkinliklere ait görüntü kayıtları, Download edilmeye açıldıkları andan itibaren de ilgi odağı oldular...https://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=0c120d49-c59e-4ac6-bb0e-ae0c55ee32450https://buraksenyurt.com/trackback.axd?id=0c120d49-c59e-4ac6-bb0e-ae0c55ee3245https://buraksenyurt.com/post/Microsoft-PDC-Icerigini-OData-Servisi-Uzerinden-Elde-Etmek#commenthttps://buraksenyurt.com/syndication.axd?post=0c120d49-c59e-4ac6-bb0e-ae0c55ee3245https://buraksenyurt.com/post/Entity-Framework-Data-Services-C-40-Excel-ve-Komple-Bir-UygulamaEntity Framework, Data Services, C# 4.0, Excel ve Komple Bir Uygulama2010-08-26T04:50:00+00:00bsenyurt<p><img style="float: right;" src="/pics/2010%2f4%2fblg181_Giris.jpg" alt="" />Merhaba Arkadaşlar,</p>
<p>Bildiğiniz üzere bir süre önce <strong>Visual Studio 2010</strong> ve <strong>.Net Framework </strong>ürünlerinin <strong>RTM </strong>sürümleri yayınlandı. Her iki ürünüde sizlerle birlikte , <strong>Microsoft PDC 2008 </strong>konferanslarından bu yana gerek yazılarımızla, gerek görsel derslerimizle incelemeye çalışıyoruz. Özellikle <strong>.Net Framework 4.0 </strong>açısından baktığımızda alet, edevat çantamızın dop dolu olduğunun eminimki hepimiz farkındayız.</p>
<p><strong>Paralel programlamadan </strong>tutun, <strong>WCF Eco System</strong>'e, <strong>C# 4.0 </strong>ile birlikte gelen yeniliklerden, <strong>WF 4.0 </strong>tarafına kadar pek çok noktada ek kabiliyetler, iyileştirmeler ve daha fazlası söz konusu. Aslında sizde benim gibi zaman zaman bu alet kutusu içerisindeki parçalardan bir kısmını alıp, örnek bir uygulamada kullanmaya çalışarak vaktinizi değerlendirmeye ve dolayısıyla offlama sorununa çare bulmaya çalışıyor olabilirsiniz. İşte bende bu düşünceler eşliğinde, havanın çok güzel olduğu şu bahar aylarında dışarıya çıkıp dolaşma şansını bulmama rağmen, evde kalıp örnek bir uygulama geliştirmeye karar verdim. İşte bu yazımız için alet çantası içinden seçtiklerimiz.</p>
<ul>
<li><strong>Codeplex </strong>üzerinden yayınlanan bir adet <a title="Chinook" href="http://chinookdatabase.codeplex.com/" target="_blank">Chinook </a>veritabanı (<a href="https://github.com/lerocha/chinook-database" target="_blank">github'a taşındı</a>) <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" />,</li>
<li><strong>Ado.Net Entity Framework 4.0</strong>,</li>
<li><strong>WCF Data Services</strong>,</li>
<li><strong>C# 4.0 Optional, Named Parameters,</strong></li>
<li><strong>Microsoft.Office.Interop.Excel</strong>,</li>
<li>ve tabiki <strong>Visual Studio 2010</strong></li>
</ul>
<p>Gelelim alet çantasından çıkarttığımız araçlar ile yapmak istediğimize...</p>
<p><img src="/pics/2010%2f4%2fblg181_Dream.gif" alt="" /></p>
<p>Öncelikli olarak <strong>Chinook </strong>veritabanının içeriğini <strong>Ado.Net Entity Framework </strong>üzerinden dış dünyaya sunan bir <strong>WCF Data Service </strong>örneğimiz olduğunu düşünebiliriz. Bu servisin sunduğu verinin istemcisi olan uygulama ise, talep ettiği içeriği alarak bir <strong>Excel </strong>uygulamas içersinde yayınlıyor olacak. Dolayısıyla <strong>Client </strong>uygulama tarafında <strong>Microsoft.Office.Interop.Excel.dll Assembly</strong>' ının referans edilmesi gerektiğini şimdiden söyleyebiliriz. Bu sayede<strong> Excel API</strong>' si yönetimli kod tarafından rahatlıkla konuşabiliyor olacağız. Diğer taraftan istemci uygulamada<strong> C# 4.0</strong> ile birlikte gelen ve <strong>Office </strong>uygulamaları ile olan etkileşimde büyük avantajlar sağlayan <strong>Named ve Optional Parameters </strong>kavramlarının ele alınacağını da ifade edebiliriz. İlk etapta hedefimiz örnek olarak <strong>Track</strong> tablosundan, istemcinin belirttiği <strong>AlbumId </strong>değerine sahip olan satırları almak ve bunları örnek <strong>Excel </strong>uygulamasında açılacak <strong>Workbook </strong>üzerindeki bir <strong>Sheet </strong>içerisinde göstermek olacak. Projeye ait <strong>Solution </strong>içeriği herşey tamamlandığında aşağıdaki gibi olacaktır.</p>
<p><img src="/pics/2010%2f4%2fblg181_Solution.gif" alt="" /></p>
<p>İlk olarak <strong>ChinookEntityLayer </strong>isimli <strong>Class Library</strong> projesinin geliştirilmesi söz konusudur. Bu <strong>Library </strong>içerisine eklenen <strong>Ado.Net Entity Data Model</strong> içerisine, <strong>Chinook </strong>veritabanında yer alan tüm tabloları ekleyebiliriz. Örneğimizde çok basit bir operasyonu göz önüne alıyor olsakta, sizlerin bu örnekten ilham alarak farklı sorguları da işin içerisine katacağınıza eminim <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /> <strong>ChinookServices</strong> isimli <strong>WCF Service Application </strong>tipinden olan uygulama, içerdiği <strong>WCF Data Service </strong>sayesinde <strong>Chinook </strong>veritabanına ait <strong>Entity </strong>koleksiyonlarını dış ortama sunmaktadır.</p>
<p>Dolayısıyla bu uygulama, <strong>ChinookEntityLayer </strong>isimli sınıf kütüphanesini de referans etmelidir. Diğer yandan önemli olan noktalardan birisi de, <strong>Entity Context </strong>nesnesi tarafından kullanılan <strong>Connection String </strong>bilgisidir. <strong>ChinookEntityLayer </strong>içerisindeki<strong> app.config </strong>dosyasına eklenen<strong> Connection String</strong> içeriğinin aslında <strong>ChinookServices </strong>isimli <strong>WCF Service</strong> uygulamasının <strong>web.config</strong> dosyası içerisinde olması gerekmektedir. Çünkü çalışma zamanında oluşturulan <strong>Context </strong>nesne örneğinin yer aldığı proje burasıdır ve bu sebepten çalışma zamanı <strong>Connection String </strong>bilgisini<strong> Web.config</strong> içerisinde arayacaktyır.</p>
<pre class="brush:xml;auto-links:false;toolbar:false" contenteditable="false"><?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="ChinookEntities" connectionString="metadata=res://*/ChinookModel.csdl| res://*/ChinookModel.ssdl|res://*/ChinookModel.msl; provider=System.Data.SqlClient;provider connection string="Data Source=.; Initial Catalog=Chinook;Integrated Security=True; MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
</configuration></pre>
<p>WCF Service uygulaması içerisinde yer alan ChinookDataService isimli WCF Data Service tipinden olan örneğin kod içeriği ise aşağıdaki gibidir.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System.Data.Services;
using System.Data.Services.Common;
using ChinookEntityLayer;
namespace ChinookServices
{
public class ChinookDataService
: DataService<ChinookEntities>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}
}
}</pre>
<p>Buna göre <strong>Chinook </strong>veritabanı içerisindeki <strong>Entity </strong>koleksiyonlarının tamamı sadece okunabilir olacak şekilde dış dünyaya sunulmaktadır.</p>
<p>Artık istemci tarafının geliştirilmesine başlanabilir. <strong>Console </strong>uygulaması tipinden olan istemci tarafına<em>(Neden Console şeklinde tasarladığımı lütfen sormayın <img title="Smile" src="/editors/tiny_mce3/plugins/emotions/img/smiley-smile.gif" alt="Smile" border="0" />)</em> öncelikle <strong>ChinookDataService </strong>isimli <strong>WCF Data Service</strong> örneğinin referans edilmesi gerekmektedir. Söz konusu servis ile istemci uygulama aynı <strong>Solution </strong>içerisinde yer aldığında <strong>Add Service Reference</strong> seçeneğini aşağıdaki şekilde görüldüğü gibi kullanmak yeterlidir.<em>(Hatırlanacağı üzere <strong>Astoria </strong>kod adlı<strong> Ado.Net Data Service</strong>' lerin<strong> Visual Studio 2008</strong> üzerinden kullanılan sürümlerinde, <strong>Add Service Reference </strong>seçeneği kullanılamamktaydı. Bunun için <strong>datasvcutil </strong>aracından yararlanmamız gerekiyordu. Tabiki, Data Service için Add Service Reference desteği <strong>Visual Studio 2010</strong> içerisinde mevcut)</em></p>
<p><img src="/pics/2010%2f4%2fblg181_ServiceReference.gif" alt="" /></p>
<p>Artık istemci uygulama geliştirilmeye başlanabilir ki belki de işin en heyacanlı kısmı burasıdır <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /> İşte Console uygulamamız ait kod içeriğimiz.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.Linq;
using ClientApp.ChinookDataServiceReference;
using Excel = Microsoft.Office.Interop.Excel;
namespace ClientApp
{
class Program
{
static void Main(string[] args)
{
// WCF Data Service örneğini kullanabileceğimi şekilde ChinookEntities nesne örneği oluşturulur.
// URI Satırı söz konusu WCF Data Service örneğini işaret etmektedir.
ChinookEntities entities = new ChinookEntities(new Uri("http://localhost:4071/ChinookDataService.svc/"));
// Kullanıcıdan AlbumId bilgisi istenir
Console.WriteLine("Album Id?");
int albumID;
if(!Int32.TryParse(Console.ReadLine(), out albumID)) //Eğer dönüşüm başarılı değilse 1 numaralı AlbumId değeri baz alınır
albumID=1;
// Sorgu cümlesi
// AlbumId değerine göre Track örnekleri çekilir. Bu işlem sırasında Genre Entity örneklerine de ihtiyacımız olduğundan Expand metodu ile gerekli çağrı yapılır
var result = from t in entities.Tracks.Expand("Genre")
where t.AlbumId == albumID
orderby t.Name
select t;
// Bir Excel Application nesnesi örneklenir.
Excel.Application excApp = new Excel.Application();
excApp.Visible = true; // Excel uygulamasının görünebilir olacağı belirtilir
excApp.Workbooks.Add(); // Yeni bir Workbook eklenir
// Sütun başlıkları set edilmeye başlanır
excApp.get_Range("A1").Value = "Track Name";
excApp.get_Range("B1").Value = "Genre";
excApp.get_Range("C1").Value = "Composer";
excApp.get_Range("D1").Value = "Milliseconds";
// Etkin olan Sheet adı belirlenir
excApp.ActiveSheet.Name = "Track List for Album Id 1";
// Elde edilen veri kümesindeki sonuçlar Sheet içerisindeki ilgili hücrelere yazdırlır
int rowNumber = 2;
foreach (var t in result)
{
excApp.get_Range(String.Format("A{0}", rowNumber.ToString())).Value = t.Name;
excApp.get_Range(String.Format("B{0}", rowNumber.ToString())).Value = t.Genre.Name;
excApp.get_Range(String.Format("C{0}", rowNumber.ToString())).Value = t.Composer;
excApp.get_Range(String.Format("D{0}", rowNumber.ToString())).Value = t.Milliseconds;
rowNumber++;
}
// Tüm sütunların uzunlukları içeriklerine göre otomatik olarak genişletilir
for (int i = 1; i < 5; i++)
{
excApp.Columns[i].AutoFit();
}
}
}
}</pre>
<p><strong>Console </strong>uygulaması kullanıcıdan bir <strong>AlbumId </strong>değeri istemektedir. Söz konusu <strong>AlbumId </strong>değerine göre <strong>WCF Data Service </strong>örneğine bir talep gönderilir ve bu talebin karşılığında dönen sonuç kümesi değerlendirilerek <strong>Excel </strong>içerisine alınması sağlanır. Uygulamanın çalışma zamanına ait örnek ekran çıktılarından birisi aşağıdaki gibidir.</p>
<p><img src="/pics/2010%2f4%2fblg181_Runtime1.gif" alt="" /></p>
<p>Ta taaaaaa!!! <img title="Laughing" src="/editors/tiny_mce3/plugins/emotions/img/smiley-laughing.gif" alt="Laughing" border="0" /> Bence güzel bir örnek oldu. Ancak daha da geliştirilmesi lazım. Her şeyden önce <strong>Console </strong>tipinde olan istemci uygulamadan kurtulmak ve görsel arayüze sahip bir örnek üzerinden ilermelek daha yararlı olacaktır. Bu size bir ödev olabilir mesela. Yazımızı sonlandırmadan önce benim sizlere bir kaç sorum olacak;</p>
<ul>
<li>Örnekte <strong>C# 4.0</strong> ile birlikte gelen hangi yeni özellikler kullanılmıştır? <em>(Daha önceki yazılarımızda değindik)</em></li>
<li><strong>WCF Data Service</strong> örneğine doğru gönderilen sorgu sonucunda elde edilen içeriğe göre, <strong>Excel </strong>üzerinde oluşturulacak sütun adları dinamik olarak belirlenebilir mi?</li>
<li><strong>WCF Data Service </strong>içerisinde kullanılan <strong>DataServiceProtocolVersion.V2</strong> değeri ne anlama gelmektedir? <em>(Daha önceki yazılarımızda değindik)</em></li>
<li>Aynı örnek için şu tip bir sorguyu deneyip <strong>Excel </strong>çıktısını almaya çalışabilir misiniz? <strong>"Composer bazlı Track sayıları?"<br /></strong></li>
<li>Uygulamanın sonunda <strong>Excel </strong>tablosunun otomatik olarak kayıt edilmesini sağlayabilir misiniz?</li>
<li><strong>WCF Eco System</strong> içerisinde yer alan <strong>Data Service</strong> dışındaki türler nelerdir? Bu servis türleri hangi amaçlarla kullanılmaktadır? <em>(Daha önceki yazılarımızda değindik)</em></li>
<li>İstemci uygulamaya ait exe dosyasının çıkartıldığı yerde <strong>Excel </strong>ile ilişkili bir <strong>Assembly </strong>bulunmamaktadır. Neden olduğunu bulup açıklayınız?<em> (Daha önceki yazılarımızda değindik)</em></li>
</ul>
<p>Tekrardan görüşünceye dek hepinize mutlu günler dilerim.</p>
<p><a href="https://buraksenyurt.com/pics/2010%2f4%2fServiceBasedExcel_RTM.rar">ServiceBasedExcel_RTM.rar (213,11 kb)</a> <strong>[Örnek Visual Studio 2010 Ultimate RTM sürümü üzerinde geliştirilmiş ve test edilmiştir]</strong></p>2010-08-26T04:50:00+00:00wcf data servicesado.net entity framework 4.0chinookc# 4.0optional and named parametersdynamicexceloffice interopvisual studio 2010bsenyurtBildiğiniz üzere bir süre önce Visual Studio 2010 ve .Net Framework ürünlerinin RTM sürümleri yayınlandı. Her iki ürünüde sizlerle birlikte , Microsoft PDC 2008 konferanslarından bu yana gerek yazılarımızla, gerek görsel derslerimizle incelemeye çalışıyoruz. Özellikle .Net Framework 4.0 açısından baktığımızda alet, edevat çantamızın dop dolu olduğunun eminimki hepimiz farkındayız.https://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=98cab3f4-98bf-4dc3-a3a7-a247fe124c0c0https://buraksenyurt.com/trackback.axd?id=98cab3f4-98bf-4dc3-a3a7-a247fe124c0chttps://buraksenyurt.com/post/Entity-Framework-Data-Services-C-40-Excel-ve-Komple-Bir-Uygulama#commenthttps://buraksenyurt.com/syndication.axd?post=98cab3f4-98bf-4dc3-a3a7-a247fe124c0chttps://buraksenyurt.com/post/Screencast-WCF-Data-Services-ProjectionsScreencast - WCF Data Services - Projections2010-03-08T02:10:00+00:00bsenyurt<p><img style="float: left;" src="http://www.buraksenyurt.com/pics/2010%2f3%2fblg161_Giris.gif" alt="" width="250" height="187" />Merhaba Arkadaşlar,</p>
<p>Yazılımcı bile olsak bu arada sırada spor yapmadığımız anlamına gelmemeli. Bende çalışma arkadaşlarım ile sık sık spor aktivitelerinde bulunuyorum. Zaman zaman parke zeminde o muhteşem NBA yıldızları gibi giyinerek basketbol oynuyor, zaman zaman Ping Pong...Geçtiğimiz günlerde ise bir halı saha maçı organizasyonundaydım. Bu organizasyonun bitmesinden hemen sonra duşumu aldım, günlük kıyafetlerimi giydim ve akşamın sekizinde bilin bakalım nereye gittim...Şirkete <img title="Laughing" src="http://www.buraksenyurt.com/editors/tiny_mce3/plugins/emotions/img/smiley-laughing.gif" border="0" alt="Laughing" /> Deli mi bu adam...Eve gitse ya...Amacı ne? Nitekim maç sırasında sürekli aklımda olan ve beni dürten bir mesele vardı. Uzun zamandır çekmek istediğim bir görsel ders için şu saatlerde sessiz olan şirket en ideal mekandı.</p>
<p><a title="NedirTv?" href="http://www.nedirtv.com/" target="_blank">NedirTv?</a> aracılığıyla hazırladığımız bu görsel dersimizde,<strong> WCF Eco System</strong>' in bir parçası olan <strong>WCF Data Service</strong>' lerinde <strong>Projections </strong>sorgularının nasıl kullanılabileceğini incelemeye çalışıyoruz. Aslında kod adı <strong>Astoria </strong>olan <strong>Ado.Net Data Service</strong>' lerin <strong>1.5 CTP2 </strong>sürümünde de duyurulan bu yetenek, zaten <strong>.Net Framework 4.0 </strong>içerisine gömülü olarak gelen<strong> WCF Data Service</strong>' ler için standartlaştırılmış bir özellik. Bu amaçla hazırladığımız ve <strong>7,5 </strong>dakikayı aşmayan görsel dersimizin faydalı olacağını ümit ediyorum. İyi seyirler dilerim.</p>
<p><strong>Dosya Boyutu :</strong> 14.3 Mb</p>
<p><strong>Süre :</strong> 7:35</p>
<p><a title="WCF Data Services - Projections" href="http://www.nedirtv.com/video/WCF-Data-Services---Projections.aspx" target="_blank">İzlemek veya Download Etmek için</a> </p>2010-03-08T02:10:00+00:00wcfwcf data servicesado.net data servicesscreencastbsenyurthttps://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=7302866a-6bc9-4e29-a930-27a19095d1cc0https://buraksenyurt.com/trackback.axd?id=7302866a-6bc9-4e29-a930-27a19095d1cchttps://buraksenyurt.com/post/Screencast-WCF-Data-Services-Projections#commenthttps://buraksenyurt.com/syndication.axd?post=7302866a-6bc9-4e29-a930-27a19095d1cc