WCF data servisleri mimarisini bir önceki yazımızdada kısaca özetlemiştik. Bu yazımızda ise bir WCF data servisinin nasıl oluşturulduğunu ve kendi özel sınıfımıza ait bir kolleksiyona bu servis üzerinden erişildiğini inceleyeceğiz.
Visual studio ortamından WcfCustomDataService adında yeni bir web projesi başlatarak bu proje üzerinde incelemelerimizi yapabiliriz.
Projemize Product ve Category adında iki yeni sınıf ekliyoruz.
[DataServiceKey("Id")]
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
[DataServiceKey("Id")]
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
}
Sınıflarımıza baktığımızda DataServiceKey ile servis anahtar property değerinin belirlendiğini görüyoruz. Bu attribute ile belirlenen anahtar özellik sayesinde OData, istenen elemana ulaşabilmektedir. DataServiceKey attribute System.Data.Services.Client.dll içindeki System.Data.Services.Common alanında bulunmaktadır. Eğer bu dll projenize dahil değilse eklemeniz gerekecektir.
Servisimiz ile ulaşabileceğimiz kolleksiyonları bulunduracağımız Store adında bir sınıf ekleyerek içerisine kolleksiyonlarımızı bu sınıf içerisine yerleştirebiliriz. Store içerisine ProductSet ve CategorySet adında iki adet generic IQueryable kolleksiyon ekliyoruz. Generic tip IQueryable olmalıdır.
public class Store
{
public IQueryable<Product> ProductSet
{
get
{
return new List<Product>
{
new Product{ Id=1, Name="Game Console" },
new Product{ Id=2, Name="IBM Computer"},
new Product{ Id=3, Name="Baby Toy"}
}.AsQueryable();
}
}
public IQueryable<Category> CategorySet
{
get
{
return new List<Category>
{
new Category{ Id=1, Name="Game" },
new Category{ Id=2, Name="Computer"},
new Category{ Id=3, Name="Toys"}
}.AsQueryable();
}
}
}
Şimdi projemizde kullanacak olduğumuz servisi eklemeye geldi. WCF data servis ekleme işlemi için projemize sağ tıklayıp Add -> New Item şeçeneği yardımıyla StoreService.svc adında bir “WCF Data Service” ekliyoruz. Servisimiz eklendiğinde kod kısmını aşağıdaki şekilde düzenliyoruz.
public class StoreService : DataService<Store>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}
}
StoreService sınıfı DataService<Store> generic tipinden türetilmiştir. Burada Store tipi bizim daha önceden tanımladığımız kolleksiyonları tutmaktadır.
InitializeService metodu DataServiceConfiguration tipinde servis ayarlarını belirleyen bir parametre almaktadır.
DataServiceConfiguration tipinin SetEntityAccessRule metodu iki parametre alamktadır. Birinci parametre string türündedir ve entity adını belirler, ikincisi ise EntitySetRights numaralandırıcı tütündedir ve entity erişim kurallarını belirler.
Örnek:
config.SetEntitySetAccessRule("ProductSet", EntitySetRights.AllRead);
config.SetEntitySetAccessRule("CategorySet", EntitySetRights.None);
Yukarıda örnekte belirlenen kuralda, ProductSet için tüm okuma yetkileri verilmiş, CategorySet için tüm erişimler kısıtlanmıştır. Bu durumda servis çağrıldığında sadece ProductSet verilerine erişilebilmektedir.
Biz bu örnekteki ayarları kullanmadan varsayılan ayarlar ile devam ediyoruz.
Servisi hazırladıktan sonra StoreService.svc’ye sağ tıklayıp “View in Browser” seçeneğini tıklayarak servise browser üzerinden ulaşabilmekteyiz. Browser, servisi XML formatında bize sunmaktadır.
ProductSet ve CategorySet kolleksiyonlarına özel URI konumlandırıcılar belirlenmiştir. Adres sonuna ProductSet ekleyerek koleksiyon içeriğine de ulaşmak mümkündür.
Bu noktada servisin sunduğu entity tiplerine ait şema bilgisini elde etmekte mümkündür. Bunun için ise URI sonuna /$metadata ekleyerek gerekli metadata bilgisi alınabilmektedir.
Bu yazıda kendi tiplerimize ait kolleksiyonlara ve metadata bilgilerine, WCF Data Servisleri yardımıyla nasıl erişilebileceğini incelemiş olduk. İlerki yazılarda WCF data servislerini daha yakından incelemeye çalışacağız.