İlkay İlknur

just a developer...

C# 5.0 - Caller Info Attributes ile Kolaylaşan INotifyPropertyChanged İmplementasyonu

Windows 8, Windows Phone 7, Silverlight ve WPF ile uygulama gelistirirken kullandigimiz ve MVVM gibi senaryolarda da siklikla basvurdugumuz INotifyPropertyChanged implementasyonu çogu zaman eger bir kod snippeti kullanmiyorsaniz biraz can sikici ve zaman kaybedici bir implemantasyon olabilmekte.

INotifyPropertyChanged interface'ini neden kullandigimizi kisaca hatirlamamiz gerekirse, elimizde bulunan tiplerin binding islemlerinde içlerinde barindirdiklari propertylerde bir degisiklik oldugu durumlarda bagli olduklari UI kontrolü üzerinde durumlarini  güncellemeleri için gerekli olan elemanlari saglamakta INotifyPropertyChanged interface'i.

INotifyPropertyChanged interface'inin içerisine baktigimizda ise çok basit bir sekilde sadece 1 event ile karsilasiyoruz.

namespace System.ComponentModel
{
    public interface INotifyPropertyChanged
    {
        event PropertyChangedEventHandler PropertyChanged;
    }
}

Evet interface implementasyonu aslinda sadece 1 eventin tetiklenmesini gerektiriyor. Bu eventi tetiklerken bir de hangi propertynin degerinin degistigini de eventi tetikleme sirasinda bildirmemiz gerekiyor ki bizim eventimizi dinleyen kontroller degisen propertynin hangisi oldugunu algilayabilsin ve buna göre de sadece degisen propertynin degerini ekranda güncellesin.

Simdi hemen basitçe Insan isminde bir tip tanimlayalim ve bu tip içerisinde Ad ve Soyad isimli property ekleyelim ve bu propertylerde de degisiklik oldugunda bind edildikleri kontrollerde de ilgili degisikliklerin yansitilmasi için bir de INotifyPropertyChanged interface'ini implemente edelim.

public class Insan : INotifyPropertyChanged
{
    private string ad;

    public string Ad
    {
        get { return ad; }
        set
        {
            ad = value;
            RaisePropertyChanged("Ad");
        }
    }

    private string soyad;

    public string Soyad
    {
        get { return soyad; }
        set
        {
            soyad = value;
            RaisePropertyChanged("Soyad");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(thisnew PropertyChangedEventArgs(propertyName));
        }
    }
}

Evet implementasyon bu kadar basit. Farketmis oldugunuz ilk sey eminim ki auto-implemented property kullanmayisimizdir. Çünkü burada ilgili propertye deger atanma sirasinda araya girmemiz gerekmekte. Bu nedenle auto-implemented property kullanamiyoruz. Bunun haricinde ise interface içerisinde bulunan eventi gerekli parametrelerle tetiklemek için RaisePropertyChanged isimli bir de yardimci metot yazdik. Bu metotta parametre olarak içerigi degisen propertynin ismini almakta. Daha sonra ise yazmis oldugumuz bu metodu propertylerin setterlari içerisinde çagirmaktayiz.

C# 5.0 - Caller Info Attributes ile Basitlesen Implementasyon

Yukaridaki implementasyona baktigimizda aslinda bize zaman kaybettiren ve interface'in implementasyonunu zorlastiran nokta aslinda RaisePropertyChanged metodunu çagirirken sürekli olarak degisen propertynin ismini vermemiz.

Simdi C# 5.0 ile beraber CallerInfo Attributes konusunu hatirlarsak aslinda Caller Info Attributes bize yapilan bir çagrim  ile ilgili olarak bilgi vermekteydi. Yani çagrim yapilan yerin satiri, bulundugu dosya ve çagrimda bulunan üyenin adi gibi alanlari saglamaktaydi. Sanki çagrim yapan üyenin adi tam bizim ihtiyacimiz olan sey :) O zaman RaisePropertyChanged metodunu su sekilde degistirsek nasil olur bir bakalim :)

public void RaisePropertyChanged([CallerMemberName]string propertyName = null)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(thisnew PropertyChangedEventArgs(propertyName));
    }
}

Gördügümüz gibi bu sekilde artik metodu çagiran üyenin adini C# 5.0 ile beraber gelen Caller Info Attributes ile alabilmekteyiz. Insan tipi içerisinde bulunan propertylerin setterlarinda da artik RaisePropertyChanged metodunu parametre vererek çagirmamiza gerek yok. Çünkü compiler bu parametreyi artik kendisi arka planda ilgili metoda opsiyonel parametre degeri olarak geçirmekte.

Son olarak Insan tipinin içerigi su sekilde olmakta.

public class Insan : INotifyPropertyChanged
{
    private string ad;

    public string Ad
    {
        get { return ad; }
        set
        {
            ad = value;
            RaisePropertyChanged();
        }
    }

    private string soyad;

    public string Soyad
    {
        get { return soyad; }
        set
        {
            soyad = value;
            RaisePropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void RaisePropertyChanged([CallerMemberName]string propertyName = null)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(thisnew PropertyChangedEventArgs(propertyName));
        }
    }
}

Baktigimizda aslinda programalama dili tarafinda gelen bir yenilik bambaska bir tarafta belki de hiç aklimiza gelmeyecek bir noktada gördügünüz gibi isimizi kolaylastiriyor. Iste programlama dillerinin de en güzel yani bu :)

Hepinize kolay gelsin :)



Silverlight 5 Beta - Implicit Data Templates

Merhaba Arkadaşlar, Bu görsel dersimizde Silverlight 5 ile gelen Implicit Data Templates özelliğini inceliyoruz. Görsel dersi buradan indirebilirsiniz. Görüşmek Üzere,


Silverlight 5 Beta - Kontrol Yenilikleri

Merhaba Arkadaşlar, Bu görsel dersimizde Silverlight 5 ile gelen Kontrol Yeniliklerini inceliyoruz.  


Silverlight 5 Beta - XAML Debugging ve Custom Markup Extensions

Merhaba Arkadaşlar,

Bu görsel dersimizde Silverlight 5 ile gelen Data Binding ifadeleri üzerinde debug yapma olanağı ile XAML içerisinde kendi markup extensionlarımızı oluşturmayı sağlayan Custom Markup Extensions özelliğini inceliyoruz.

Görsel dersi buradan indirebilirsiniz.

Umarım faydalı bir görsel ders olmuştur.

Görüşmek Üzere,



Silverlight 5 Beta - Style'lar İçerisinde Binding ve Ancestor RelativeSource Binding Özelliği

Merhaba Arkadaşlar, Bu görsel dersimizde Silverlight 5 Beta ile gelen Style'lar içerisindeki Binding özelliği ile Ancestor RelativeSource özelliğini inceliyoruz. Umarım faydalı bir ders olmuştur. Görsel dersi buradan indirebilirsiniz. Herkese Kolay Gelsin, Hoşçakalın


Silverlight 5 Beta - Tarayıcı İçerisinde Elevated Trust ve OOB Yenilikleri

Merhaba Arkadaşlar, Bu görsel dersimizde Silverlight 5 Beta ile tarayıcı içerisindeki Elevated Trust özelliği ile OOB tarafında gelen sınırsız dosya erişimi, multiple Ad-Hoc Windows özelliklerini inceliyoruz.

Görsel dersi buradan indirebilirsiniz.

Umarım faydalı bir görsel ders olmuştur.

Görüşmek Üzere,



Silverlight 5 RC Yayınlandı !!!

Merhaba Arkadaşlar,

1 Eylül itibariyle Silverlight 5 artık RC(Release-Candidate) sürümüne ulaştı ve developerların testine sunuldu. RC sürümü ile beraber Beta sürümünde bulunan mevcut özelliklerin üzerine post-beta'da gelecek olan özellikler dediğimiz özellikler de eklenmiş oldu.

Bu Özellikler,

  • P/Invoke desteği ile native metotların çağrılabilmesi
  • 64-bit desteği
  • DataContextChanged Eventi
  • Browser içerisinde Trusted uygulamalar
  • SDK içerisinde PivotViewer kontrolü
  • Vector Printing
  • Media Uygulamalarında Uzaktan Kumanda Desteği

Beta sürümden RC sürümüne değişen bir nokta var mı diye baktığımızda ise major değişiklik olarak karşımıza Beta sürümde RichTextBox kontrolünde bulunan Linked Text desteğinin artık RichTextBlock kontrolüne kaydırıldığını görüyoruz.

Unutmadan, RC sürümünün hala daha Go-Live lisansı bulunmamakta. Yani sadece developerlara açık bir sürüm. Smile

Expression Blend tarafını merak edenler için ise şu anda Silverlight 5 RC sürümü için güncellenmiş bir Expression Blend 5 sürümünün olmadığını belirtmek isterim. Mevcut Expression Blend Preview'ı Silverlight 5 RC ile kullanırken aksaklıklar yaşayabilirsiniz. Bunun için de Silverlight 5 RC için güncellenmiş Expression Blend 5'i beklemekte yarar var.

Silverlight 5 RC sürümünü http://www.silverlight.net/downloads adresinden indirebilirsiniz.

Silverlight 5 'in release olma zamanına baktığımızda ise muhtemelen bu yılın sonları olacağını rahatlıkla söyleyebiliriz.

Bende bu süreçte RC ile gelen yeniliklerin detaylarını yine sizlerle paylaşıyor olacağım.

Görüşmek Üzere,



WCF RIA Services'a Giriş

Merhaba Arkadaşlar,

Bu yazımızdan itibaren Silverlight 4.0 ile beraber kararlı sürüme ulaşmış olan WCF RIA Services'ı incelemeye başlayacağız. WCF RIA Services nedir ? ve neden ortaya çıkmıştır gibi sorulara bu yazımızda cevap bulmaya çalışacağız. İlerleyen yazılarda da uygulama geliştirme kısmına geçerek iyice WCF RIA Services konusunun derinliklerine inmeye çalışacağız.

Silverlight ile Veri Odaklı Uygulama Geliştirme

Silverlight kullanarak özellikle veri odaklı uygulamalar geliştirmeye başladığımızda istemci tarafındaki Silverlight uygulaması ile sunucu tarafındaki ASP.NET uygulaması arasındaki iletişimi web servisler aracılığıyla gerçekleştirmekteyiz. Tabi bu iletişimi web servisleri ile gerçekleştirmemizin temel nedeni de Silverlight uygulamasının tamamen istemci tarafında çalışmasıdır.  Bu noktada çoğunlukla WCF'in Silverlight için sunduğu özel binding sayesinde bu iletişimi daha hızlı hale getiren "Silverlight-enabled WCF Service" kullanırken aynı zamanda klasik ASMX uzantılı web servislerini de yine Silverlight uygulamalarında kullanabilmekteyiz.

Baktığımız zaman Silverlight ilk olarak çıktığından beri veri odaklı uygulamalarımızı bu şekilde geliştirmekteyiz ve hala da bu yöntem yaygın olarak kullanılmakta. Ancak bu şekilde uygulama geliştirdiğimizde özellikle development tarafında bazı tekrarlayan işler yapmak durumunda kalabilmekteyiz. Öncelikle biraz büyük çaplı bir uygulama gerçekleştirdiğimizde özellikle servise yeni bir metot eklediğimizde ya da serviste bulunan bir metodun imzasını güncellediğimizde bu güncellemeyi aynı zamanda Silverlight uygulaması tarafındaki servis referansında da yapmak durumundayız. İşte bu durum özellikle servisiniz biraz büyüdükçe zaman almakta ve bazı zamanlarda can sıkıcı olabilmektedir.

Bunun yanında kullandığımız yöntem çok temel bir yöntem olduğu için paging, validation, authentication gibi mekanizmaları genelde kendimizin gerçekleştirmesi gerekmekte. Tüm bunlar da şüphesiz ki uygulama geliştirme süresini oldukça arttırmaktadır. Ayrıca istemci tarafındaki Silverlight uygulamasının servis metotlarını asenkron olarak çağırmasıyla beraber metot sonuçlarının alındığı handler metot tanımlamaları da baktığımızda uygulamaları biraz daha karmaşık hale getirmektedir.

WCF RIA Services ??

WCF RIA Services'a baktığımızda ise aslında adından da anlayabileceğimiz üzere WCF ekosistemi içerisinde bulunan bir programlama modelidir. Connected Systems MVP'si Burak Selim Şenyurt hocanın blogunda bulduğum WCF ekosistemini açıklayan resme bakıldığı zaman aslında WCF RIA Services'ın tam olarak nerede bulunduğunu çok daha iyi anlayabiliriz.

WCF RIA Services tamamen WCF altyapısını kullanmakla beraber bir WCF servisi üzerinde yapabildiğiniz tüm konfigürasyonları WCF RIA Services üzerinde de yapabilmekteyiz. WCF RIA Service tanımına baktığımızda aslında adında anlaşılacağı gibi RIA uygulamalarında yani Silverlight uygulamalarında kullanılmak üzere geliştirilmiş bir programlama modelidir.

WCF RIA Services ile beraber özellikle Silverlight uygulamalarında n-tier modelinde uygulama geliştirmeyi kolaylaştırmak amaçlanmıştır. Ayrıca özellikle Visual Studio 2010 üzerinde bulunan geniş tooling özellikleri ile de özellikle veri uygulamaları geliştirmek oldukça kolay bir hale gelmiştir.  Bunun yanında yine kod tarafında ilerleyen yazılarda da göreceğimiz üzere artık sunucu tarafındaki metotları çağırmak çok çok daha kolay bir hale gelmiştir. Ayrıca artık "Update Service Reference"  yapmaya da gerek kalmamaktadır. Wink

Bunun yanında WCF RIA Services ile istediğiniz veri tabanı erişim katmanını da kullanmanız mümkün. İster LINQ to SQL yada Entity Framework kullanın isterseniz NHibernate. Yada ADO.NET !Smile

İlk yazımızın sonuna gelirken kısaca bir özet yapmak gerekirse, WCF RIA Services, WCF ekosistemi içerisinde bulunan ve Silverlight uygulamaları geliştirmede gerek Visual Studio 2010 tarafında büyük kolaylıklar sağlayan gerekse programlama tarafında işleri oldukça kolaylaştıran yeni bir servis programlama modelidir. Bu programlama modeli yine altyapısında tamamem WCF'in altyapısını bulundurmakla beraber Silverlight uygulamalarının geliştirilmesi amacıyla çok daha kolay ve basitleştirilmiş bir programlama modelini yazılım geliştiricilere sunmaktadır.

Bir sonraki yazımızda ilk WCF RIA Services uygulamasına giriş yapacağız.

Görüşmek Üzere,



Ilk WCF RIA Services Uygulaması

Merhaba Arkadaşlar,

Bu yazımızda WCF RIA Services'ı kullanan ilk uygulamamızı yaratıyor olacağız. Yazı içerisinde temel olarak bir WCF RIA Services uygulaması nasıl yaratılabilir, hangi farklı seçenekler kullanılabilir konusunu incelerken bir de kısaca kod tarafına geçerek WCF RIA Services uygulamalarında istemci tarafında bulunan Silverlight uygulamasından server tarafında bulunan uygulamada bulunan metotlara erişim nasıl sağlanıyor, hangi bileşenlere ihtiyaç duyuluyor konusunu da inceleyerek yazımızı sonlandıracağız.

İlk WCF RIA Services Uygulaması

WCF RIA Services'ı kullanmak için öncelikle File -> New Project diyerek bir Silverlight projesi (Silverlight Application) yaratmamız gerekmekte. Bu ekranı OK diyerek geçtikten sonra oldukça tanıdık olan bir pencere ile karşılaşıyoruz. Bu pencere daha önceden de bildiğimizi üzere Silverlight uygulamasını test etmek üzere Solution içerisine bir ASP.NET web sitesi koymak isteyip istemediğimizi soran bir pencere. Ancak bu pencerenin en altına baktığımızda bu sefer farklı bir seçenek ile karşılaşmaktayız.

 

Eğer Silverlight projemiz içerisinde WCF RIA Services'ı kullanmak istiyorsak bu seçeneği seçmemiz gerekmekiyor. Peki bu seçeneği seçtikten sonra Silverlight projesinde ne gibi bir değişiklik gerçekleşmekte ?? Aslında yapılan sadece belirli assemblylerin Silverlight projesine referans edilmesi.

Bu assemblyler ise şunlar,

  • System.ComponentModel.DataAnnotations
  • System.Runtime.Serialization
  • System.ServiceModel
  • System.ServiceModel.DomainServices.Client
  • System.ServiceModel.DomainServices.Client.Web
  • System.ServiceModel.Web.Extensions

Daha sonra yukarıdaki ekranı da OK'e basarak geçtikten sonra alıştığımız üzere WCF RIA Services'ı kullanmaya hazır olan Silverlight uygulamasını yaratmış durumdayız. Artık bu noktadan sonra yapmamız gereken projeye gerekli bileşenleri ekleyerek uygulama geliştirmeye geçmek. Ancak bu safhaya geçmeden önce yaptığımız bu işlemlerin hepsini otomatik olarak yapmış olan ayrıca da belirli bir takım özellikleri de içerisinde barındıran bir proje şablonu olduğunu söylesem ne dersiniz ? Smile Öyleyse zaman kaybetmeden bir göz atalım.

Silverlight Business Applications

File -> New Project dediğimiz zaman Silverlight tabını seçtikten sonra proje tipleri arasında bir de "Silverlight Business Applications" bulunmakta. Bu seçeneği seçerek projeyi yarattığımızda karşımıza çeşitli servisleri daha önceden yaratılmış, pek çok farklı konuda (login,logout vs..) hazır yapılar içeren ve belirli bir görsel teması olan bir Silverlight Navigation uygulaması ile karşılaşmaktayız. İsterseniz de bu uygulama şablonu üzerinden gereken değişiklikleri yapmak suretiyle de Silverlight uygulamanızı geliştirebilirsiniz. Ancak biz sıfırdan temiz bir Silverlight uygulaması yaratarak uygulamalarımızı geliştiriyor olacağız.

 

Silverlight Projelerine WCF RIA Services Linkleme

Belki yazıyı bu noktaya kadar okuyup sıkılanlar olabilir basit noktalar üzerinden geçtiğim için ancak konuya tam olarak hakim olunması için bu detaylarında bilinmesi gerektiğini düşünmekteyim. Kod tarafına geçmeden önce son olarak değinmek istediğim nokta da sunucu ve istemci tarafındaki uygulamaların bağlanması. İlk yazımızda da bahsettiğim gibi aslında WCF RIA Services, sunucu taraftaki uygulama ile istemci tarafındaki Silverlight uygulamasını bağlayan bir yapı. Bu nedenle istemci tarafındaki uygulama ile bağlanacak olan WCF RIA Service'ı kolay bir şekilde bağlayabiliriz. Bu bağlama işlemi zaten proje içerisinde yaratılma sırasında yapılmakta ve bu işlemin sonucunda yazının ilerleyen kısımlarında bahsedeceğim üzere çeşitli code-generation işlemleri gerçekleştirilmekte. Ancak yine de bazı durumlarda bu linki değiştirmemiz gerekebilir. Bu işlemi ise şu şekilde yapmaktayız.

Öncelikle Silverlight projesine sağ tıklayarak properties seçeneğini seçerek Silverlight projesinin özelliklerini görüntülüyoruz. Daha sonra ekranın en altında WCF RIA Services Link adında bir başlık bulunmakta. Bu başlık içerisinde bulunan combobox vasıtasıyla solution içerisinde bulunan farklı WCF RIA Service'ları Silverlight uygulamasına bağlayabilme imkanına sahibiz.

 

WCF RIA Services Projesinin Bileşenlerini Yaratalım

Evet artık bu noktadan sonra kod kısmına geçiyoruz ve uçuşa geçiyoruz. Wink Yazımızın başında da bahsettiğimiz gibi temiz bir silverlight projesi yarattık ve gelen pencereden "Enable WCF RIA Services" seçeneğini seçtik ve Silverlight projemizi de WCF RIA Service'ı kullanabilecek duruma getirdik. 

Şimdi öncelikle olarak Data Modelimizi tanımlayacağız. Yani projemiz içerisinde bulunacak olan veri erişim katmanını oluşturacağız. İlk yazıda da bahsettiğim gibi bu katmanı oluşturmak için aslında pek çok farklı alternatifimiz bulunmakta. Yani LINQ to SQL ya da Entity Framework kullanabildiğimiz gibi NHibernate'te kullanabiliriz. Ancak biz örneklerimizde Entity Framework'ü kullanarak ilerleyeceğiz. Genelde örnekleri yaparken örnek olması amacıyla Northwind veritabanını kullanıyor olacağız. Eğer sizde bu veritabanı bulunmuyorsa Microsoft üzerinden indirebilirsiniz.

Data Modelimizi yaratmak üzere sunucu projemiz üzerinde sağ tıklayarak "Add New Item" diyoruz ve "ADO.NET Entity Data Model" 'i  seçerek data modelimize de NorthwindModel adını vererek OK'e basıyoruz. Daha sonra ise bir wizard ile karşılaşmaktayız. Buradan da modelimizi bir veritabanından oluşturacağımızı belirten "Generate from database" 'i seçerek ve Next diyerek bir sonraki ekrana geçiyoruz.

Karşımıza gelen yeni ekran üzerinden de veritabanı bağlantımızı seçerek Next'e basıyoruz.

 

Daha sonra ise son olarak karşımıza seçtiğimiz veritabanı üzerinde bulunan tablo,view ve stored procedurelerin listelendiği bir ekran ile karşılaşıyoruz. Bu ekran üzerinden şu anda başlangıç olması amacıyla Products ve Categories tablolarını seçiyoruz. Ayrıca model içerisinde objectlerin isimlendirilmesinde tekilleştirme-çoğullaştırmanın kuralının uygulanması için "Pluralize or Singularize generated object names" seçeneğini de seçerek Finish butonuna tıklıyoruz ve veri modelimizi yaratıyoruz.

 

Veri Modelimizi de sunucu tarafında yarattıktan sonra şimdi bu yarattığımız modeli istemci tarafındaki Silverlight uygulamasına sunacak olan servisi yaratmamız gerekmekte. Bunun için de yine sunucu uygulamamıza "Domain Service Class" ekliyoruz. Ekleyeceğimiz Domain Service Class sayesinde sunucu tarafında bulunan entityleri ve çeşitli operasyonlar istemci uygulaması tarafından erişilebilir durumda olacak.

Sunucu projesine Domain Service Class'ı ekledikten sonra ise bazı seçimleri yapmak üzere bir ekran ile karşılaşıyoruz.

  

Bu ekran içerisinde öncelikle istemci tarafındaki uygulamanın kullanması için hangi entityleri dışarı sunmamız gerektiğiniz seçmemiz gerekiyor. Eğer bu entityler üzerinden herhangi bir değişiklik yapılacaksa de "Enable Editing" seçeneğinin seçili olması gerekmekte. Ayrıca "Enable Client Access" seçeneğinin de entitylerin istemci tarafındaki uygulama tarafından erişilebilir olması için seçili olması gerekmekte. Son olarakta en altta bazı metadata değişiklikleri yapmak üzere ilgili sınıfların yaratılmasını isteyip istemedğimiz sorulmakta. Bu seçeneği de seçerek ileride metadata'yı kullanacağımız durumlar için hazırlıklı hale geliyoruz ve OK'e basarak servisi oluşturuyoruz.

Şu ana kadar yaptıklarımızı özetlersek ilk olarak web uygulaması tarafında veri erişimini sağlayacak veri katmanını ADO.NET Entity Framework kullanarak yarattık ve daha sonra gerek yarattığımız entityleri gerekse sunucu tarafında bulunan çeşitli işlemleri Silverlight uygulamasına sunacak olan Domain Service Class'ı yarattık.

Şu anda uygulamamız artık geliştirmeye hazır duruma geldi. Bir sonraki yazımızda artık basit CRUD işlemlerini gerçekleştirecek bir uygulama geliştirerek iyice WCF RIA Services dünyasına dalacağız.

Görüşmek Üzere,



WCF RIA Services CRUD(Create,Read,Update,Delete) İşlemleri

Merhaba Arkadaşlar,

Bu yazımızda daha önceden giriş yaptığımız WCF RIA Service’lerinde CRUD işlemlerini inceliyor olacağız. Eğer İlk WCF RIA Service Uygulaması isimli yazıyı okumadıysanız öncelikle bu postu okumanızı tavsiye ederim. Çünkü doğrudan bu post içerisinde yarattığımız veri modeli ve domain service üzerinden ilerliyor olacağız.

Sunucu Tarafında Oluşturulan Kodlar

WCF RIA Servicelerini kullandığımız uygulamalarda sunucu tarafında çalışacak olan ASP.NET projesi içerisine bir Domain Service Class eklediğimiz zaman bir önceki postumuzda da göreceğimiz gibi daha önceden eklediğimiz veri modelini seçmekte ve bu model içerisinde bulunan hangi tiplerin servis üzerinden dışarıya sunulacağını seçmekteyiz. Ayrıca bu tiplerin servis üzerinden bilgilerinin değiştirilip değiştirilemeyeceği bilgisini verdikten sonra Domain Service Class’ımız oluşmakta ve bir takım yardımcı kodlar üretilmekte. Örneğin Product tipi için yaratılan kodları inceleyelim.

 public IQueryable<Product> GetProducts()        
{            
return this.ObjectContext.Products;        
public void InsertProduct(Product product)
{            
if ((product.EntityState != EntityState.Detached))            
{                
this.ObjectContext.ObjectStateManager.ChangeObjectState(product,EntityState.Added);
}            
else            
{               
this.ObjectContext.Products.AddObject(product);            
}        
}         
public void UpdateProduct(Product currentProduct)        
{            
this.ObjectContext.Products.AttachAsModified(currentProduct,this.ChangeSet.GetOriginal(currentProduct));  }         
public void DeleteProduct(Product product)        
{            
if ((product.EntityState == EntityState.Detached))            
{                
this.ObjectContext.Products.Attach(product);            
}            
this.ObjectContext.Products.DeleteObject(product);        
}

Kodlara baktığımız zaman Visual Studio’nun biz yardımcı olması amacıyla CRUD işlemlerini gerçekleştiren bir takım metotları yarattığını görmekteyiz. İlk olarak GetProducts isimli metodu incelediğimizde IQueryable interface’ini implemente eden bir tip döndürdüğünü görmekteyiz. Böylece IQueryable interface’ini implemente eden bir tipin Silverlight uygulamasına döndürülmesiyle beraber bu tip üzerinde Silverlight tarafında LINQ sorgusu yazıp sunucuya göndermemiz mümkün olacaktır.

Bunun haricinde InsertProduct, DeleteProduct, UpdateProduct isimli metotları incelediğimizde metotlar içerisinde parametre olarak alınan nesnelerin statelerinin değiştirilerek ilgili işlemlerin gerçekleştirildiğini görmekteyiz.

Ayrıca metotları incelerken isimlerinden de farkedeceğiniz gibi bir isimlendirme standartı mevcut. Get{Tip İsmi}s, Update{Tip İsmi}, Delete{Tip İsmi}, Insert{Tip İsmi} şeklinde bir standart olduğunu görmekteyiz. Böylece birazdan da göreceğimiz üzere Silverlight tarafında doğrudan service üzerinden Add, Delete, Insert yada Products gibi referanslar üzerinden birtakım işlemleri gerçekleştireceğiz. Böylece arka planda aslında ilgili isimlendirme standartına uygun olarak yazılan metotlar çağrılacaktır. Peki bu isimlendirme standartını değiştiremiyor muyuz ? Tabi ki değiştirebiliriz. İlerleyen yazılarda attribute bazlı yaklaşımlarla nasıl değişirebileceğimizi de inceliyor olacağız.

Silverlight Tarafına Geçiyoruz

Sunucu tarafındaki uygulamamızı derlediğimizde de Silverlight uygulaması için de birtakım proxy yaratma işlemleri gerçekleştirilmekte. Normalde baktığımızda hiçbir değişiklik göremiyoruz. Ancak Visual Studio içerisinden "Silverlight projesi için “Show All Files” seçeneğini seçersek WCF RIA Service için yaratılan kodları görebiliriz. Yaratılan kodlar adı üzerinde Generated_Code klasörü içerisinde bulunmakta. :)

Burada yaratılan kodu incelediğimizde bütün kodlar aslında ASP.NET tarafında bulunan Domain Service Class’ın bulunduğu namespace içerisinde bulunmaktadır. Böylece biz developerlara doğrudan Silverlight uygulaması içerisinden ASP.NET sunucu uygulamasına erişiyor hissi vermektedir. :)

Evet arkadaşlar daha fazla uzatmadan teorik kısımdan şimdi pratik kısma geçiyoruz ve uygulamamıza başlıyoruz.

Create İşlemi

Örnek kodlarımıza ilk olarak Category tipini yaratarak başlıyor olacağız. İlk olarak CreateCategory isimli metodumuzu yaratıyoruz ve bu metot içerisinde bir adet Category tipini örnekleyerek daha sonra WCF RIA Service’ini kullanarakta nesnemizi veritabanına ekliyoruz. Şimdi ilk olarak Category tipini örnekleyelim.

Category category = new Category()            
{                
CategoryName="Bisiklet",                
Description="Bisiklet Kategorisi",            
};

Daha sonra ise yarattığımız nesneyi WCF RIA Service üzerinden göndermemiz için tıpkı bir normal web servisini kullandığımız gibi WCF RIA Service’I için de bir proxy yaratmalıyız. Bunun için de NorthwindDomainContext tipini kullanıyor olacağız. Daha sonra ise bu tip üzerinde bulunan Categories propertysini kullanarak yarattığımız category isimli nesneyi ekliyor olacağız.

NorthwindDomainContext context = new NorthwindDomainContext();            
context.Categories.Add(category);            
context.SubmitChanges();

CreateCategory ismini verdiğimiz metodun tamamı ise şu şekilde olacak.

NorthwindDomainContext context = new NorthwindDomainContext();        
private void CreateCategory()        
{            
Category category = new Category()            
{                
CategoryName="Bisiklet",                
Description="Bisiklet Kategorisi",            
};            
context.Categories.Add(category);            
context.SubmitChanges();        

Read İşlemi

WCF RIA Serviceleri üzerinden okuma işlemleri yapmak için de LoadOperation isimli tipten yararlanıyor olacağız. LoadOperation tipi WCF RIA Serviceleri üzerinde bir takım veri çekme işlemleri için bizlere oldukça yardımcı olmakta. Yazdığımız sorguların sunucu tarafına gönderilmesi ve sunucudan döndürülen değerlerin de Silverlight uygulaması tarafından kullanılmasını doğrudan LoadOperation tipi üzerinden gerçekleştiriyoruz. Buradaki örneğimizde ise GetCategories isimli bir metot yazarak veritabanımızda bulunan tüm Kategorileri Silverlight tarafına çekiyor olacağız.

 private void GetCategories()        
{            
var query = context.GetCategoriesQuery();            
LoadOperation<Category> loadOp = context.Load<Category>(query);            
loadOp.Completed += (sender, e) =>                
{                    
if (!loadOp.HasError)                    
{                        
dataGrid1.ItemsSource= loadOp.Entities;                    
}                    
else                    
{                        
MessageBox.Show(loadOp.Error.Message);                        
loadOp.MarkErrorAsHandled();                    
}                
};        
}

Yazdığımız metodu incelersek öncelikle sunucuya göndereceğimiz sorguyu alarak işleme başlıyoruz. Çünkü NorthwindDomainContext tipi üzerinden GetCategories isimli sorguyu göndereceğimizi bildirmemiz gerekmekte. Daha sonra ise bu tip üzerindeki Load metodunu kullanarak sorgunun sunucuya gönderilmesini ve sunucudan da sonuçların alınmasını sağlıyoruz. Lambda ifadesi ile Completed eventine basit bir handler yazarak  ta çağrım sırasında herhangi bir problem olup olmadığını anlayabilir eğer bir hata yoksa sonucu bir veri görüntüleme kontrolüne (örneğimizde DataGrid kontrolüne) bağlıyoruz.

Burada sunucuya gönderdiğimiz sorguları değiştirme imkanına da sahibiz. Örneğin CategoryID’si mesela 3 olan Kategori nesnesini elde etmek ilgili  sorguyu Silverlight tarafında da yazıp sunucuya gönderebiliriz.

 var query = context.GetCategoriesQuery();            
var querybyId = from category in query  where category.CategoryID == 3                            
select category;            
LoadOperation<Category> loadOp = context.Load<Category>(querybyId);

Bu işlemi sunucu tarafında CategoryID’sini parametre olarak alan ve Category tipinden bir sonuç döndüren bir metot yazarakta gerçekleştirebilirdik. Ancak bu çeşitlilikten de anlayabileceğiniz gibi WCF RIA Services’ın pek çok kuvvetli ve alternatifli bir çözüm olduğunu görmekteyiz.

Update ve Delete İşlemleri

WCF RIA Servicelerinde Delete işlemi de Insert işlemine oldukça benzemekte. Silmek istediğimiz entityi doğrudan context üzerinden Remove metoduna vererek entityi veritabanımızdan silebiliriz. Update işlemi için de entity üzerinde değişiklikleri yaptıktan sonra context üzerinden SubmitChanges metodunu çağırıyoruz.
context.Categories.Remove(category);            
context.SubmitChanges(); 
Yazımızın sonuna gelirken şu ana kadar WCF RIA Serviceleri üzerinden Create, Read, Update ve Delete işlemlerini incelemiş olduk. Bir sonraki yazımızda görüşmek üzere arkadaşlar… Hoşçakalın…