Ana içeriğe atla

Silverlight Business Application – WCF RIA Services

Web uygulamaları günler geçtikte daha bir görsel ve daha bir işlevsel olmaktadır. Bu gelişmenin Microsoft gerçekleşmesini sağlayan teknoloji ise Silverlight 'tır. Başlarda basit animasyon işlemleri yaparken şu anda WCF servisleri ile validation kontrolleri ile ve diğer bir çok özelliği ile Asp.Net uygulamalarına alternatif olarak düşünebilir seviyeye gelme yolunda son sürat ilerlediğini gözlemliyoruz. Bu süreçlerin ilerlemesi ile iş uygulamalarında da Silverlight düşünülmeye başlanmıştır. Bildiğiniz üzere Asp.Net MVC Framework yardımı ile veri, nesne ve görsel katmanları ayrı ayrı kullanabilmemize olanak tanıyan bir şablon ile karşımıza gelmektedir. Bu uygulama şablonunda özellikle Entity katmanı yardımı ile veri işlemleri üzerinde yapacak olduğumuz işlemleri rahatça yapılabilmesi mümkündür. Silverlight Business Application yardımı ile de hazır bir şablon gelmekte ve işleri kolaylaştırabilmektedir. Silverlight Business Application hakkında temel bilgi ve proje şablonu hakkında bilgi edinmek için burada yer alan yazıdan yararlanabilirsiniz.

Silverlight Business Application, WCF RIA servisleri yardımı ile veri işlemlerini domain servisler ile uyumlu bir şekilde gerçekleştirebilmesi mümkündür ki alt yapısı da bu entegrasyon üzerine kurulmuştur. Biz de bu yazımızda WCF RIA servislerini kullanarak veri üzerinde ekleme, silme ve gösterme işlemlerini inceliyor olacağız.

Not: WCF RIA servisleri konusunda ayrıntılı bilgi edinmek için buradan yararlanabilirsiniz.

Silverlight Business Application Silverlight 3 ve 4 araçları içerisinde yer alan iş süreçlerine uyumluluğu olan bir proje şablonudur. Yeni bir proje oluşturulurken kullanıcı üyelik, sisteme giriş, windows authentication yardımı ile sisteme giriş yapabilme, ana sayfa gibi temel yapıları bünyesinde katmansal bir yapı ile bulundurduğu için tercih edilebilecek oldukça güzel bir proje şablonudur. Şimdi adım adım basit bir örnek üzerinde neler yapabileceğimize incelemeye başlayalım.

Not: Geliştirilecek olan uygulama, Visual Studio 2010 üzerinde Silverlight 4 kurulu bulunan bir bilgisayar üzerinde yapılacaktır. Ayrıca veri tabanı sunucusu olarak SQL Server 2008 Express Edition kullanılıyor olacak. Uygulama esnasında kullanılacak olan veri tabanını buradan indirip kendi veri tabanı sunucusunuza ekleyip kullanabilir ve yazı içerisinde yapılan örnekleri benzer veriler ile uygulayabilirsiniz. Dosyanın boyutu 3 mb 'dir.

Uygulama geliştirirken Entity Framework ve WCF RIA Domain servisi kullanıyor olacağız. Visual Studio üzerinde yeni proje oluştur diyip Silverlight proje sablonları arasından Silverlight Business Application 'ı bulup projemizi oluşturuyoruz.

mak92_1

Karşımıza Silverlight ve web projesi olmak üzere içerisinde iki proje olan şablon ile açılmaktadır.

mak92_2

Projeyi oluşturduktan sonraki bir diğer adım WCF RIA Servisini uygulama hangi projeden link alarak kullanacağıdır. Bu amaçla Silverlight projesinin özellikler ekranında bu özelliğin aktif olup olmadığını kontrol ediyoruz.

mak92_3

Web projesine WCF RIA Servisi linkini vererek kullanıcı tarafında domain servislerinin kullanılabilmesini de aktif duruma getirmiş oluyoruz. Bu sayede entity framework ile gösterecek olduğumuz verileri web uygulamasını referans göstererek her yerde kullanabilmemiz mümkün olacaktır. Peki, geliştirilecek olan uygulamalarda WCF RIA servisi kullanmanın ne gibi avantajları olacaktır.

Katmansal uygulamalarda geliştirme kolaylığı, .Net ile geliştirilen uygulamaların sunucu-kullanıcı arasındaki etkileşimi sağlamayı kolaylaştırır.
Varlıkların karşılıklı paylaşılması, Model sınıfları, doğrulama (Validation) kuralları ve diğer veri ilişkileri
Kullanıcı tabanlı destekleyiciler, Otomatik veri eşlemeleri, sayfalama, güncelleme, değişiklik takibi

şeklinde temel faydalarını kısa başlıklar altında sıralayabiliriz.

 mak92_4

Web sunucusunu Domain Service ve Model 'den oluşmaktadır. Model Entity Modelinden oluşur ve içerisinde CRUD işlemleri olarak adlandırılan create,read,update ve delete işlemlerini barındırır. Domain Services ise Entity Data model 'de bulunan işlemlerin aktarılmasında yer alır. İşleyiş mantığı ise Silverlight kullanıcısından alınan verilerin model katmanı ile hangi yöne yönleneceğinin belirlenmesi ile gerekli veri mesajları Domain Context 'e iletilir. Buradan işi asıl yapacak olan web sunucusuna verilerin aktarılması işi ise WCF ile yapılmaktadır.

RIA Domain servielerininin temel olarak sağladıkları aşağıdaki gibidir.
WCF Servisleri, Bütün WCF özellikleri kullanılabilir. Servis referansları eklenebilir.
Özelleştirilmiş taban sınıfları, LinqToEntities (Ado.Net Entity Data Model), LinqToSQL (Linq To SQL Data Model) ve Authentication bazlı sınıfların oluşturulabilmesi.

WCF RIA servisleri yalnızca verilerin taşınması değil aynı zaman gösterilmesini sağlamaktadır. Proje içerisine eklenmiş olan DomainServise gösterilen veri modelini veri kaynağı olarak gösterdikten sonra oluşan objeleri silverlight formlar üzerine sürükle bırak yöntemi ile GridView görünümünde verilerin gösterilebilmesi ve düzenlenebilmesi olanağı vardır. Ayrıca bu grid içerisinde ListBox, Combox gibi kontrollerin kullanılabilmesi mümkündür. Ayrıca grid üzerinde gösterilmekte olan verileri düzenlenmesi anında Silverlight 'ın sağladığı bütün kontrollerin kullanılabilmesi olanağı da vardır. Peki ne tür veri kaynakları kullanabiliriz. Silverlight Business Application 'da WCF RIA servislerinin dışında .Net uygulamaları geliştirirken kullanılan bütün veri kaynaklarının kullanılabilmesi mümkündür. Tavsiye ise daha önceden açıkladığımız sebeplerden ötürü WCF RIA servisleridir.

Yapmış olduğumuz kısa tanımlamalar, açıklamalar ve uygulama içerisinde WCF RIA servislerinin link edildiğini görmemizin sonrasında uygulamamızı geliştirmeye başlayabiliriz.

RIA servislerinden bu kadar bahsettikten sonra öncelikli olarak web projesinin içerisinde services klasörünün içerisinde yer alan Domain Services sınıflarına göz atalım. İlk etapta iki tane sınıf bulunmaktadır. Bunlar, Authentication ve UserRegistration servisleridir. Bu sınıflarda gerekli servislerin içlerinde User nesnesini kullanarak kullanıcıların sismete giriş yapma veya kayıt olma işlemlerini yapabilmeleri mümkündür. Şimdi uygulamayı çalıştırarak oluşturulan login ve yeni kullanıcı formlarına hemen göz atalım.

mak92_5

Kullanıcı giriş ekranı ise,

mak92_6

şeklindedir. Daha önceden vermiş olduğumuz linkte yer alan veri dosyasını web uygulamasında yer alan App_Data klasörüne ekleyerek sonrasında da Server Explorer içerisinde tablolara bakarak veri dosyasının doğru olarak eklendiğini kontrol ediyoruz. Sonrasında ise veri modelini oluşturmamız gerekmektedir. Bu amaçla Ado.Net Entity Framework ten yararlanacağız. Web projesine yeni bir öğe ekle seçeğini kullanarak ADO.NET Entity Data Model 'i seçerek adımları tamamlıyoruz. Tablo kısmında aşağıda yer alan resimdekileri eklememiz yeterli olacaktır.

mak92_7

Bu adımdan sonra Entity Model tanımlanmış oluyor. Sonrasında sorunsuzca çalışması ve eklenen DLL 'lerin temp dosyalarının oluşması için bir kere uygulamayı derliyor ve sonrasında adımlarımıza devam ediyoruz. Şimdi uygulamaya Domain Service sınıfını ekleyeceğiz. Bunun için web uygulamasında services klasörünün üzerinde sağ tıklama yapıyoruz ve yeni bir öğe ekle diyoruz. Sonrasında web tabının içerisinde yer alan Domain Service Class ekliyoruz. Sonrasında bizden veri kaynağımıza ilişkin kullanacağımız tabloları seçmemizi isteyecektir. Bu ekranı aşağıdaki şekilde hazırlıyoruz.

mak92_8

İşlemi tamamladıktan sonra EventManagerDomainService.cs ve EventManagerDomainService.metadata.cs isimli iki dosya oluşturmaktadır. Metadata dosyasının içerisinde tablolarda yer alan öğelerin nesnesel olarak metotlarda özellikleri yer alır. EventManagerDomainService içerisinde ise metadata içerisinde yer alan nesnelerden yararlanarak hazırlanmış olan CRUD işlemlerinin yapılacağı metotlar yer almaktadır.

Sıra işin biraz daha görsek kısımlarına geldi. Verileri göstermek için gerekli altyapıyı hazırladık. Şimdi bu verileri kullanarak son kullanıcıya değerler göstermemiz gerekmektedir. Bunun için Silverlight uygulamasının içerisinde Views klasörünün içerisinde yer alan Home.xaml ekranından yararlanıyor olacağız. Bu sayfayı açtıktan sonra data menüsünün altında yer alan Show Data Source 'a tıklayarak WCF RIA servisleri ile gelen veri kaynaklarını görüntüleyebiliriz.
mak92_9

Eklemiş olduğumuz tablolar veri kaynağı kısmında bizim kullanımızı hazır olarak beklemektedir.

mak92_10

EventManagerDomainContext içerisinde yer alan objelerin üzerine inceleme yaptıysanız GridView şeklinde hazırlanmış olduğunu ve direk kullanılabilir durumda olduğu dikkat çekmektedir. Bize bu durumda yalnızca form üstüne bunlardan herhangi birini sürükleyip verileri görüntelemek kalıyor. Bu yazımızda örnek olarak Event nesnesini kullanıyor olacağız.

mak92_11

Veri gösterme işini başarılı bir şekilde başardık. Sıradaki işlemimiz ise bu veriler üzerinde düzenleme yapmak için neler yapamamız gerektiği olacaktır.

Düzenleme işleminin yapılabilmesi için öncelikli olarak Views klasörüne yeni bir sayfa ekliyor olacağız. Silverlight Business Application ile örneği yaparken sayfaların navigation page olduğu dikkatinizi çekmiştir. Bunun amacı asp.net ve mvc 'den alışık olduğumuz  URL Routing 'e benzer bir yapı içermesinden ve sayfalar arası geçişin URI yardımı ile rahatlıkla yapılabilmesinden kaynaklanmaktadır. Şimdi düzenleme yapacağımız sayfayı ekleyebiliriz. Eklemiş olduğunuz sayfanın <navigation:Page ile başladığını görüyor olacaksınız.

Şimdi ana amacımız grid üzerinden seçilen kaydın değerlerini güncellemektir. Bu işlemi yapabilmek için de seçili olan satırın ID 'sine ulaşıp bu değeri taşımamız gerekmektedir. Bu amaçla formun üzerine bir adet buton ekliyoruz. Butonun içerisinde ID 'den yararlanarak başka bir sayfaya yönlendirecek ve değerleri güncelleyeceğiz. Butonu form üzerine ekledikten sonra üzerine tıklanması anında yapılacak olayları aşağıdaki gibi belirtiyoruz.
private void editEventButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
    Event selectedEvent = eventDataGrid.SelectedItem as Event;
    if (selectedEvent != null)
    {
        int eventId = selectedEvent.EventID;
        NavigateToEditEvent(eventId);
    }
}

private void NavigateToEditEvent(int eventId)
{
    Uri target = new Uri("/EditEvent?EventID=" + eventId, UriKind.Relative);
    NavigationService.Navigate(target);
}
YYapmış olduğumuz işlemler yardımı ile Event tablosunun içerisinde yer alan değerlerden seçili olanın ID 'sini yakalayıp EditEvent sayfasına o ID 'den yararlanaraj gerekli yönlendirmeyi yapıyoruz. Şimdi hızlıca yönlendirme işleminin sorunsuzca olup olmadığını test etmek için uygulamayı seçip kontrol edelim.

mak92_12

Sayfayı sorunsuzca yönlendirdik. Şimdi ise bu gelen ID yardımı ile verileri gösterip düzenleme işlemini nasıl yapabileceğimize göz atacağız. EditEvent sayfasına geliyoruz ve Data Source kısmına göz atıyoruz. Verileri gösterirken Event tablosunun içeriğini kullandık ve bu bize otomatik olarak GridView yardımı ile gerçekleştirmiştik. Şimdi aynı işlemi Event tablosunun içerisinde yer alan kolonların detaylarını göstererek yapmak gerekecektir. Bu amaçla Event tablosunun yanında açılan DropDownList 'in içerisinde Detail seçeneğini seçiyor ve EditEvent sayfasına tabloyu sürüklüyoruz.

mak92_13

Detay kısmına getirdikten sonra form üzerinde sürüklediğimizde bize form kontrollerinden oluşan bir şablon çıkacak ve bunlar iki yönlü olarak veriye bağlanmış olacaktır. Sürükleyip bıraktığınızda karşınıza çıkacak olan şablon aşağıdaki gibi olacaktır.

mak92_14

Sırada yapmamız gereken bu formun içeriğini doldurabilmek amacıyla QueryString'ten yararlanarak EventId 'yi yakalamak ve sonrasında ekrana eklemiş olduğumuz buton ile güncelleme işlemini gerçekleştirmektir.

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    string eventIdString = NavigationContext.QueryString["EventID"];
    int eventId;
    if (int.TryParse(eventIdString, out eventId))
    {
        eventDomainDataSource.FilterDescriptors.Add(
            new FilterDescriptor
            {
                Operator = FilterOperator.IsEqualTo,
                PropertyPath = "EventID",
                Value = eventId
            });
    }
}

private void saveChangesButton_Click(object sender, RoutedEventArgs e)
{
    eventDomainDataSource.SubmitChanges();
}

QueryString ile yakaladığımız EventID 'yi filtre olarak kullanıp sonrasında içerik filtreleme yardımı ile EventID değerine eşit olan değerleri gösteriyoruz. Sonrasında ise Entity Framework 'un güzelliklerinden yararlanarak değişiklikleri kaydet diyerek işlemi tamamlıyoruz. Sonrasında uygulamayı çalıştırıp düzenleme işlemlerini yapıp değiştir dediğimizde yapmış olduğumuz değişikliklerin uygulandığını görmüş oluruz.

mak92_15
Düzenleme işlemlerini nasıl yapabileceğimizi incelemiş olduk. Şimdi ise yeni bir kaydı nasıl ekleyebileceğimizi incelemeye çalışacağız. Yeni bir kayıt eklerken yine Entity katmanından yararlanıyor olacağız. Ayrıca form üzerine var olacak kontrollere önceden bir kaç ön bilgi girerek daha anlaşılır olmasını sağlayacağız. Örneğin tarih kısmında <01.01.2010> gibi örnek bir değer olacaktır.

İşlemlerimize öncelikle bir kayıt ekle butonunu home.xaml sayfasına ekleyerek başlıyoruz. Sonrasında eklemiş olduğumuz tıklanması anındaki olayına aşağıdaki kod parçasını ekliyoruz.

private void newEventButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
    DateTime nowDate = DateTime.Now;
    Event newEvent = new Event
    {
        EventTitle = "<Yeni Aktivite>",
        EventVenueName = "<Yer>",
        EventDescription = "<Açıklama>",
        EventStartDate = nowDate,
        EventEndDate = nowDate
    };

    var ctx = new EventManagerDomainContext();
    ctx.Events.Add(newEvent);
    ctx.SubmitChanges(createOP =>
    {
        NavigateToEditEvent(newEvent.EventID);
    }, null);
}

Entity içerisinde bulunan Events koleksiyonuna varsayılan olarak gösterilecek değerleri ekledikten sonra WCF RIA servisi olarak eklemiş olduğumuz EventManagerDomainContext 'ten yararlanarak yeni kayıt eklenmesi için gerekli işlemleri ekledik. Ayrıca kayıt eklenmesi için gerekli formu aktivite düzenlemek için kullandığımız forma yönlendirmek için NavigateToEditEvent metodunu kullanarak gerekli yönlendirme işlemini gerçekleştirmiş oluyoruz.

Not: EventManagerDomainContext farklı isimler ile projenizin içerisinde bulunabilir. Bu tanımlamayı doğru olarak öğrenebilmek için DataSources tabının içerisinde yer alan veri kaynaklarına bakarak öğrenebilirsiniz.

mak92_10

Yaptığımız işlemler sonraında yeni kayıt girme ekranının nasıl gözüktüğüne hızlıca göz atalım.

mak92_16

Sonuç olarak bu yazımızda Silverlight Business Application proje şablonunda WCF RIA servislerini nasıl kullanabileceğimizi temel CRUD işlemleri üzerinde incelemeye çalıştık.

Umarım sizler için yararlı olabilmiştir.
 
Kaynaklar

Turhal Temizer

info@turhaltemizer.com

Yorumlar

Admin dedi ki…
Merhaba uygulamanın aynısını yaptım ama şöyle bir hata alıyorum:

"Error 1 'BusinessApplication2.Views.EditEvent.OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs)': no suitable method found to override"

Sebebi sizce ne olabilir.
Turhal Temizer dedi ki…
Projeye eklemiş olduğunuz sayfayı Silverlight Web Page olarak eklediniz değil mi? Bu event 'i standart aspx sayfalardaki Page_Load override event 'i şeklinde düşünebilirsiniz. Bu sebeple Bu evet sayfasınız da olması gerekmektedir. Aksi taktirde siz yazarsanız Override edeceği bir event bulamayacağı için bu tür bir hata alabilme şansınız mevcut. Eğer ki belirttiğim kullanıma uygun bir şekilde oluşturduysanız yazmış olduğunuz kod parçasını bana gönderebilr misiniz?

Bu blogdaki popüler yayınlar

Olasılıksız - Kitap Yorum

Olasılıksız hayatımda okuduğum en iyi kitaptı. Tek çırpıda hiç sıkılmadan, eğlenerek okudum bu kitabı, tavsiyem sizinde okumanız.Kitabın kapağı ve içeriği ile ilgili kısa bilgi aşağıdadır.Olasılık, tahmin, düşünceler, nöbetler, karışıklıklar, ileriyi görebilme zannı, dejavu ve tabii ki olasılıksız şeyler. Bu kelimelerle içli dışlı olabileceğiniz, bütün bu kelimelerin yaşamdaki yerini kavrayabileceğiniz müthiş bir uyarlama.Adam Fawer' ın ortaya çıkardığı bu uyarlama romanın müthiş bir çalışmanın ve araştırmanın sonucu ortaya çıktığının kitabın başından sonuna kadar farkındasınız. Bu uyarlamasını, derin araştırmalarıyla birleştirip romanı tekdüzelikten çıkarıp müthiş bir yere koyduğu için de Fawer' a müteşekkir oluveriyorsunuz. Sıkıcı diye nitelendirebileceğiniz teorik bilgileri bile bir çırpıda okuyuveriyorsunuz. Teorik bilgiler dahi olaylarla sonuna kadar bağlantılı aktarılmış. Tekdüzelikten çıkmış bir roman; olasılıksız. Her an olayın kurgusunun değişmesi olasılık dahilinde. …

.Net 3.5 SP1 – Full Install Packages (Tam Kurulum)

.Net Framework 3.5 SP1 ‘i bilgisayarınıza kurmak istediğinizde normal şartlar altında Microsoft ‘un sitesinde 2.7 mb ‘lik bir dosya indirir ve kurulum işlemlerinizi bu dosya üzerinden yaparsınız. Ancak bu indirmiş oluğunuz dosya yaklaşık 220 mb ‘lik veriyi internetten indirerek kurulum yapmaktadır. İnternet çıkışına izin verilmeyen kurumlar ve kuruluşlar için bu durum bir sıkıntı oluşturmaktadır. Bu sebepten ötürü aşağıdaki link yardımı ile tam yükleme paketini indirdikten sonra hiç internet ihtiyacınız olmadan .Net 3.5 SP1 ‘i kurabilmeniz mümkün olacaktır.Link

Çoklu Dil Desteği – Veri Tabanı Tasarım Örnekleri ile

Zaman içerisinde karşımıza çok farklı projeler gelebilmektedir. Ancak bu projeler içerisinde özellikle de global ölçekli ya da bu ölçekte uygulama geliştiren firmalarda bazı temel gereksinimler sürekli olarak karşımıza çıkabilmektedir. Bu gereksinimlerden biri ve belki de en önemlisi olan çoklu dil desteğinin veri tabanı (DB) katmanında nasıl yapıldığını kısa ve hızlıca inceliyor olacağız.Öncelikle çoklu dil desteği dediğimizde aklımıza gelen ilk çözüm yolu *.resx dosyalarını kullanmak gelmektedir. Ancak bu uzaktan yönetilen ya da anlık olarak metin değişikliği gereksinimi bulunan uygulamalarda bazı ufak problemler çıkartabilmektedir.Ne gibi problemler derseniz; iki grupta inceleyebiliriz. Web projeleri ve windows üzerinde çalışan projeler.Web projelerinde IIS üzerinde yer alan bir *.resx dosyasını değiştirdiğinizde son kullanıcı tarafında etkisi hemen görülmeyebilir. Cache mekanizmaları sebebiyle ortalama 15-30 dakika arasında bir görüntüleme süre farkı ile karşılaşabiliriz. Faha köt…