İlkay İlknur

just a developer...

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…


Yorum Gönder