Silverlight ile 31 Gün yazi dizisinin 7.günündeyiz.
Bugün size basit bir WCF servisin nasil olusturulacagini ve bir Silverlight uygulamasindan nasil çekilecegini gösterecegim. Pespese iki mesaj yazmamdan da anlayacaginiz üzere Data Servislerinin oldukça sik ihtiyaç duyacaginiz birsey oldugundan bahsedecegiz.
Silverlight Uygulamanizi Olusturun
En bastan baslayacagim. Ilk olarak, yeni bir Silverlight projesi olusturuyoruz. Ben kendimin kini JBWCFService olarak adlandirdim.

Silverlight projemize eslik edecek bir web projesini de olusturacagiz. Açilir listeden bir tane a Web Application Project seçiyorum.

Projeler olusturulduktan sonra Solution Explorer’im size böyle görünecek. JBWCFService isminde bir Silverlight projem ve JBWCFServiceWeb isminde bir de Web Application projem artik mevcut.

Yeni bir Data Source olusturun
Daha sonra, kendi verilerimi çektigim bir SQL veritabani olusturuyorum. Tablo ve sütun olusturmanin tüm basamaklarini tek tek açiklamayacagim. Bunu her yerden ögrenebilirsiniz. Projeme SQl veritabanimi asagidaki gibi ekliyorum...

Kendi Servisinizi olusturun
Pekala, artik kendi servisimizi olusturalim. Ismini MyNewService olarak koyuyorum. Bu projemize ekleyecegimiz basit birsey, sadece o kadar.
Ilk olarak, yeni bir servis olusturuldu, projenizde birkaç tane yeni dosya görebilirsiniz. Benim klasörümde IMyNewService.cs, MyNewService.svc ve code-behind’lari olan MyNewService.svc.cs seklinde adlandirilmislar. Varsayilan olarak, arayüz (IMyNewService.cs) açilacak ve editlemeye hazir sekilde karsiniza gelecek. Sizin için bir DoWork() metodu olusturacak. Ama biz bunu silecegiz ve biraz daha ilginç bir seyler yapacagiz. Önce, LINQ’yu almamiz ve verilerimize karsi kullanmamiz gerek. Ben kendiminkini LINQClasses olarak adlandiriyorum.
Class dosyalarini eklememize ek olarak, bu yaptigimiz islemle beraber LINQ dizayn penceresi varsayilan olarak açilacak. Data Structute’dan verilerimizi temsil eden ORM class yapilarini olusturan sayfadaki item’lari sagdan sola sürükleyebiliriz. Benim yaptigim örnekte, sadece bir tane tablo ve profil var ama bunu tüm tablolarimiz için de yapabiliriz ve metodlari olusturdugumuz pencerenin sagina sürükledigimiz prosedürleri saklayabiliriz. Ben zaten tabloma asagidaki resimdeki gibi sürükledim.

Verilerimizin tek yönlü olarak sirali halde aktarilmaya müsait(serializable) olup olmadigindan da emin olmak isteriz. Dizayn penceresine tiklayarak(tablo kutucuklarindan sadece birine degil) DataContext’in özelliklerini görebilir veya Serialization Mode’u Unidirectional (tek yönlü) olarak degistiredebiliriz.

Referans olarak Servis Eklemek
Simdi de web uygulama projesinde WCF servisimizin çalistigini farketmeliyiz. Bunu yapmak için, Silverlight projemize, yeni bir servis referansi eklememiz gerekecek. Otomatikman bulmak içn "Discover" butonuna tiklayin. Bu sekilde, web server’i da otomatik olarak çagiracak. Ben bu servis referansinin adini MyNewServiceReference olarak koydum.

Simdi azicik kod yazmanin tam sirasi...
Bu noktada, hersey bizim için otomatik olarak hallolacak. Ellerimizi birazcik tasin altina sokmamiz gerekecek. Servis arayüzümüz IMyNewService.cs’e geri gidelim. Orada,DoWork() metodunu ortadan kaldirin. Onun yerine kendimiz için olusturdugumuz yeni class’larimizi temel alan, veritabanimizdan aldigi profillerin listesini geri döndüren metodu yazalim. Çünkü bu bir arayüz, burada metodu fonksiyonel olarak tanimlamiyoruz, sadece isaret birakiyoruz. Metodumun adini GetProfilesByLastName olarak koyuyorum.

Biliyorum birazcik zahmetliydi. Simdi de kendimiz için bir miktar daha kod yazalim. MyNewService.svc ’nin code behind dosyasini (MyNewService.svc.cs) açalim. Içerisinde, önceden tanimladigimiz arayüzden kalan seyler göreceksiniz. Arayüzün üzerinde sag tiklayin ve uygulamanizi çalistirin.

Artik metodumuzun shell’i de var. Yapmamiz gereken sey, metoda ne yapmasi gerektigini söylemek olacak. Iste burada LINQ kullanilmaya baslayacak. Daha öncesinde DataContext’imize bir referans almamiz gerekecek ve sonrasinda soyadi sorgusuna dayanan veritabanindan isimleri geri çagiran basit bir sorgu yazdim. Son olarak listemizdeki datalara geri dönüyoruz.
Her seferinde servisimizi güncelliyoruz. Silverlight projesinde servis referansimizi güncellememiz de gerekiyor. Böylece bu da yeni metodumuz oluyor. Servis referansinin üzerinde sag tiklayin ve "Update Service Reference"i seçin. Üstelik web.config dosyamiza ufak bir de degisiklik yapmamiz gerek. Size verdigim yönergeleri dogru takip ettiyseniz, web.config dosyanizda biraz asagi indiginiz zaman <endpoint binding="wsHttpBinding" /> özelligini görürsünüz. Silverlight sadece basicHttpBinding’e destek verdigi için biz de onu degistirmeliyiz.

Simdi de Silverlight projemize, XAML dosyamizla son kez ilgilenmeden önce birkaç tane daha referans eklememiz gerekecek. System.Windows.Controls.Data kismina bir referans eklemeliyiz ki arayüzümüzde Datagrid’i kontrol edebilelim.

XAML Zamani
Page.xaml dokümanimizda bir namespace için bir referans dahil ediyoruz. Pekala, simdi de sayfamiza bir miktar daha kontrol ekleyebiliriz. Ben zaten daha düzenli olmasi için StackPanel’in içine bir buton bir textbox ve bir de Datagrid ekledim.
Servisimizi Çagiralim
Simdi, servisimize metodumuzu çagiralim ve gridimizi dolduralim. Ilk yapmaniz gereken sey ServisClient’imizi örneklerle desteklemek olacak. Bu servisi asenkronize olarak çagirdigimizdan beri, DataGrid’i güncelleyebilmemiz için gereken verilerin ne zaman geri döndügünü tutacak olan event handlerimizi da kurmamiz gerekecek. Asagidaki ekran görüntüsü, ihtiyacim olan tüm kodlari gösteriyor, ama baslangiç kodumuzda su sekilde olmali:
sc.GetProfilesByLastName +=
Aynen bu sekilde yazdim. Bundan sonra da, Tab tusuna iki defa bastim. Ilk bastigimda, EventHandler durumunu sonlandirdi. ikinci bastigimda da EventHandler metodumu olusturdu. Bu sekilde içini de bosaltmis oldum. Son olarak, Button_Click metodumda, GetProfilesByLastName’i DataEntry diye adlandirilan TextBox’imdan alinan degerlerin geçirildigi sekilde asenkronize olarak geri çagirmam gerekiyor.

Son bir rötus islemimiz var. O da, bu uygulamamizda Datagrid’i baglamamiz gerekiyor ve bunu da kendimiz için olusturdugumuz yeni EventHandler metodunda yapmaliyiz. Metod’daki tek satir kod söyle:
DataGrid.ItemsSource = e.Result;

Sonunda bitirdik. SQL Server ile iletisim kurabilmesi için LINQ kullanan bir WCF Servis ve bu servisi kullanan ve sonuçlari render’layan bir de Silverlight projesini olusturabildik. 17 adim ve birkaç satir kod pek de fena sayilmaz.
Çözüm dosyasini indirmek için color=#0000cc buraya tiklayiniz.
Haberci Destek Tim adina çevirisi Hanefi tarafindan yapilmistir.