İlkay İlknur

just a developer...

WCF RIA Servicelerinde Invoke Attribute’ü ile CRUD İşlemleri Haricindeki Metotların Gerçekleştirimi ve Çağrımı

Merhaba Arkadaşlar,

Bir önceki yazımızda WCF RIA Serviceleri üzerinde CRUD işlemlerinin nasıl yapılabileceğini incelemiştik. Bu yazımızda sunucu tarafındaki Domain Service Class içerisindeki metotlarda bir isimlendirme standartı olduğunu ve bu standarta uygun olarak Silverlight tarafından yapılan isteklerin ilgili metoda gönderildiğinden bahsetmiştik. İleriki yazılarımızda tabi bu standartın dışına nasıl geçebileceğimizi de inceliyor olacağız.

Ancak bu yazımızın konusu Domain Service Class içerisine entityler üzerinde işlem yapmayan metotların nasıl ekleneceği. Örneğin biraz kompleks bir veri uygulaması üzerinde çalıştığımızı düşünürsek bu uygulama içerisinde bir dosya yükleme kısmı olabilir. Peki aslında entity işlemleri ile herhangi bir ilgisi olmayan bu işlemi nasıl gerçekleştirebiliriz ? Biz yazımızın odağını çok değiştirmemek adına ve yazımızın konusu Silverlight ile dosya uploadu olmadığı için konunun anlaşılması için çok daha basit bir işlem gerçekleştiriyor olacağız. Mesela blog yazılarının ve görsel derslerin vazgeçilmezi aritmetik işlemler. :)

İlk olarak Domain Service Class içerisine toplama ve bölme işlemi yapan iki metot yazarak uygulamamıza başlıyoruz.

public int Add(int x,int y)        {            return x + y;        }         public double Divide(double x,double y)        {            if (y == 0)            {                throw new ArithmeticException("Y 0 olamaz.");            }            else            {                return x / y;            }        }

Metotlarımızı yazdıktan sonra Silverlight tarafına geçelim ve yazdığımız metotları çağırmayı deneyelim.

Gördüğünüz üzere Silverlight tarafından yazdığımız metotlara ulaşamadık. Peki neden ? Çünkü metotlarımızın WCF RIA Service üzerinden yayınlanması gerektiğini tanımlamadık. WCF RIA Servicelerinde Entityler üzerinde CRUD işlemleri haricinde yapılan diğer işlemlerin WCF RIA Service üzerinden dışarıya sunulması için Invoke attribute’ünün kullanılması gerekmekte. Invoke attribute’ünü ekledikten sonra Add ve Divide metotlarımızın son hali ise şu şekilde.

[Invoke]        public int Add(int x,int y)        {            return x + y;        }         [Invoke]        public double Divide(double x,double y)        {            if (y == 0)            {                throw new ArithmeticException("Y 0 olamaz.");            }            else            {                return x / y;            }        }

Evet arkadaşlar artık sunucu tarafındaki işimizi bitirip Silverlight tarafına geçiyoruz ve Silverlight tarafından Invoke attribute’ü ile işaretlenmiş metotların nasıl çağrılabileceği konusuna geçiyoruz.

Tıpkı CRUD operasyonlarında olduğu gibi işlemlerimizi yine bir örneğini yarattığımız NorthwindDomainContext tipi üzerinden gerçekleştiriyor olacağız. Daha sonra zaten bu örnek üzerinden doğrudan ilgili metotları çağırabilmekteyiz. Invoke ile işaretlediğimiz metotları çağırırken bu metotların dönüş tiplerine baktığımızda InvokeOperation tipini görmekteyiz. Bu tip aslında işlevsellik olarak hemen hemen bir önceki yazımızda bahsettiğimiz LoadOperation tipi ile benzer. InvokeOperation tipi ile gerçekleştirdiğimiz işlemin Completed eventini yakalayabilir ve çağrım sonucunu elde edebilir ve ilgili bir takım işlemleri gerçekleştirebiliriz. İsterseniz çok fazla uzatmadan uygulamamıza geri dönelim.

void MainPage_Loaded(object sender, RoutedEventArgs e)        {            NorthwindDomainContext context = new NorthwindDomainContext();            InvokeOperation invokeOpt = context.Add(2, 3);            invokeOpt.Completed += (_sender, _e) =>                {                    if (!invokeOpt.HasError)                    {                        MessageBox.Show("Sonuç ="+invokeOpt.Value.ToString());                    }                    else                    {                        MessageBox.Show(invokeOpt.Error.Message);                        invokeOpt.MarkErrorAsHandled();                    }                };             InvokeOperation divideOpt = context.Divide(6, 2);            divideOpt.Completed += (_sender, _e) =>                {                    if (!divideOpt.HasError)                    {                        MessageBox.Show("Sonuç =" + divideOpt.Value.ToString());                    }                    else                    {                        MessageBox.Show(divideOpt.Error.Message);                        divideOpt.MarkErrorAsHandled();                    }                };        }

Kodlardan da anlayabileceğiniz gibi metotlardan dönen sonuçları InvokeOperation örneği içerisinde bulunan Value propertysi üzerinden alıyoruz. Yine bir takım hata kontrollerini de tıpkı LoadOperation tipi üzerinde olduğu gibi yapabilmekteyiz.

Evet arkadaşlar bu yazımızında sonuna gelirken özet bir şekilde WCF RIA Serviceleri üzerinden nasıl CRUD işlemleri haricindeki işlemlerin gerçekleştirebileceğini görmüş olduk. Böylece Invoke attribute’ünü kullanarak bir takım dosya upload işlemleri veya değer alma işlemleri gerçekleştirilebilir durumdayız. Bir sonraki yazımızda görüşmek üzere… Hoşçakalın…


Yorum Gönder