Silverlight : Daten mit .NET RIA Services Preview einbinden

Von Andreas Aschauer Autor Feed 4. September 2009 16:03

In meinen letzten beiden Posts habe ich beschrieben, wie man serverseitige Datenquellen mittels den ADO.NET Dataservices leicht in Silverlight Applikationen einbinden kann.

Noch einen Schritt weiter bei der Integration von Daten mittels asynchroner REST API gehen die RIA Services. Mit der aktuellen .NET RIA Services July Preview, lässt sich ein Entity Data Model, wie in den Artikeln zu den ADO.NET Dataservices erstellt wurde, einfachst für den Client verfügbar machen.

Als Beispiel dient wieder ein Teil des Silverlight RSS Readers. Vorraussetzung ist natürlich die Installation der .NET RIA Serivces July Preview und der Silverlight 3 Tools für Visual Studio (Links am Ende des Artikels).

Als erstes ein neues Projekt mit dem Template ‘Silverlight Navigtion Application’ anlegen. Dieses Template ist ein guter Startpunkt, besonders für LOB Applikationen, da es Out-Of-The Box Features wie Deep Linkung und besonders ansprechende Fehlerbehandlung bietet. Details zu Silverlight Navigation Applications

NewSLNavApp

Als Web Project Type wieder “ASP.NET Web Application Project” auswählen und nicht vergessen unter “Options” –> “Enable .NET RIA Services” anzukreuzen.

NewSLApplication

Nachdem das Projekt erzeugt wurde, fügen wir dem Web Projekt, wie in den letzten Artikeln beschrieben ein neues Entity Data Model hinzu. Dann ein neues Domain Data Service hinzufügen mittels Rechtsklick –> “Add” –> “New Item” . Aus der Liste ‘Domain Service Class’ als Typ auswählen.

AddDomainService

Im Wizard als DataContext das erzeugte Entitiy Framework Model auswählen und alle Entitäten wählen sowie das Editieren aktivieren.

 SLDomainService

Jetzt wird das DomainService erzeugt und mit CRUD Methoden für die gewählten Entitäten automatisch ausgestattet.

Nachdem die Solution neu kompiliert wurde sollte das Service im Silverlight Projekt über den Namespace des Web Hosting Projekts verfügbar sein.

Im Beispiel wurde der Domain Service im Web Hosting Projekt im Namespace SilverReaderNavigation.UI.Web.Data erstellt.

var ctx = new SilverReaderNavigation.UI.Web.Data.SilverReaderDomainContext();

Der DomainContext wird automatisch generiert und kapselt alle WebService-spezifischen Operationen und Methoden, so dass man sich nicht mehr um eine Service Reference und die Generierung eines Proxies zu kümmern braucht.

Sollte der Namespace nicht verfügbar sein, prüfen ob ein Ordner “Generated Code” im Silverlight Projekt erzeugt wurde. Dazu im Solution Explorer “Show All Files” aktivieren und ggf. die generierte Klasse in diesem Ordner zum Projekt hinufügen.

IncludeGeneratedRIACode

Sollte der Ordner nicht da sein: Rechtsklick auf das Silverlight Projekt –> “Unload Project” . Danach nochmals Rechtsklick auf die .csproj Datei –> “Edit *.csproj”. Dadurch wird die csproj Datei im XML Editor geöffnet. Im XML im 1. Element “Property Group” sollte sich ein Knoten befinden der die Client Applikation mit dem Server Projekt verlinkt.

<LinkedServerProject>..\SilverReaderNavigation.UI.Web\SilverReaderNavigation.UI.Web.csproj</LinkedServerProject>

Hat man es geschafft, den DomainContext im Client Projekt zu erzeugen, kann mit einer sehr einfachen Syntax, die die asynchrone Natur der Aufrufe komplett verbirgt, auf die serverseitigen Daten zugegriffen werden. Um zum Beispiel eine Liste aller Feeds aus dem Entity Data Model in einem Grid anzuzeigen, reichen 3 Zeilen.

   1: var ctx = new SilverReaderDomainContext();
   2: feedGrid.ItemsSource = ctx.Feeds;
   3: ctx.Load(ctx.GetFeedsQuery());

Es besteht auch die Möglichkeit deklarativ direkt in XAML die Datenbindung durchzuführen mit der “DomainDataSource” aus der Assembly ‘System.Windows.Ria.Controls’ .

   1: xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Ria.Controls"
   2: xmlns:Data="clr-namespace:System.Windows.Data;assembly=System.Windows.Ria.Controls"
   1: <riaControls:DomainDataSource x:Name="feedDataSource" LoadSize="20" PageSize="10" QueryName="GetFeeds" AutoLoad="True">
   2:             <riaControls:DomainDataSource.DomainContext>
   3:                 <App:SilverReaderDomainContext></App:SilverReaderDomainContext>
   4:             </riaControls:DomainDataSource.DomainContext>
   5:             <riaControls:DomainDataSource.SortDescriptors>    
   6:             <Data:SortDescriptor PropertyPath="Name" Direction="Ascending"></Data:SortDescriptor>
   7:     </riaControls:DomainDataSource.SortDescriptors>
   8: </riaControls:DomainDataSource>

Zuerst werden die Namespaces importiert. Dann wird die Methode GetFeeds des erzeugen ‘SilverReaderDomainContext’ aufgerufen. Gleichzeitg wird mit dem Attribut ‘LoadSize’ festgelegt wie viele Einträge bei einem Aufruf geladen werden sollen und ‘PageSize’ legt fest wie viele Einträge pro Seite im Grid angezeigt werden sollen. Über einen ‘SortDescriptor’ wird anschliessend noch eine Default Sortierung festgelegt.

Das dazu passende Grid inklusive Pager ist dann folgendermassen definiert.

   1: <data:DataGrid x:Name="feedGrid" ItemsSource="{Binding Data}" IsReadOnly="True" Width="1200" Height="500"   />
   2: <data:DataPager PageSize="10" Source="{Binding Data}" />

Und um die asynchrone Natur des ganzen Ladevorgangs zu nutzen, kann noch das Activity Control verwendet werden um einen Ladebalken anzuzeigen.

   1: <my:Activity IsActive="{Binding IsLoadingData }" VerticalAlignment="Top" HorizontalAlignment="Left" Width="1200" Height="500" >    
   2:     <StackPanel>
   3:         <data:DataGrid x:Name="feedGrid" ItemsSource="{Binding Data}" IsReadOnly="True" Width="1200" Height="500"   />
   4:         <data:DataPager PageSize="10" Source="{Binding Data}" />
   5:     </StackPanel>
   6: </my:Activity>

Die Eigenschaft ‘IsActive’ des Activity Controls wird einfach an die Eigenschaft ‘IsLoadingData’ der DomainDataSource gebunden. Somit wird jedesmal wenn die DataSource Daten lädt ein laufender Balken als  Warteanimation angezeigt.

Activity

Das Activity Control ist seperat als Download unter dem unten angeführten Link verfügbar.

Die RIA Services sind zwar bisher nur eine Preview, aber es lassen sich damit in kürzester Zeit nette LOB Anwendungen realisieren. Besonder in Zusammenspiel mit dem Silverlight Navigation Application Template zeigt die Preview wie man ernsthafte, daten-zentrische Anwendungen in Silverlight umsetzen kann.

Links:

Silverlight: Entity Data Modelle via ADO.NET Data Services in Silverlight konsumieren – Teil 1

Silverlight: Entity Data Modelle via ADO.NET Data Services in Silverlight konsumieren – Teil 2

Downloads:

.NET RIA Services July Preview

Silverlight 3 Tools for Visual Studio

RIA Services Activity Control

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading

www.microsoft.com/austria | © 2009 Microsoft Corporation. Alle Rechte vorbehalten.
BlogEngine.NET 2.5.0.6 powered by atwork