Silverlight 2 Beta 2 und ADO.NET Data Services
Seit Silverlight 2 Beta 2 draußen ist, kann ich endlich wieder an meinem Projekt weiterarbeiten. Ich schreibe eine kleine Anwendung die auf einen Datendienst zugreift, den ich mit den ADO.NET Data Services erstellt habe. Ich mußte feststellen das es drei wichtige Dinge zu beachten gilt:
System.Data.Services.Client
Dieses Assembly ist verantwortlich für die Integration des Proxy Codes in das Silverlight Projekt. Es muß referenziert werden damit der erstellte Proxy mittels DataSvcUtil entsprechend funktioniert.
Asynchrone Aufrufe
Möchte man nun auf Daten zugreifen, so muss dies immer asynchron geschehen. Synchrone Aufrufe werden in der aktuellen Beta nicht unterstützt.
Versucht man synchron eine Abfrage gegen den Data Service mittels eines Proxies abzusetzen
1: var query = from p in ctx.Products
2: select p;
3:
4: foreach( var item in query )
5: {
6: // do something
7: }
bekommt man eine NotImplementedMethodException . Man muss auf jeden Fall asynchron arbeiten. Die eigentliche Abfrage muss explizit in ein DataServiceQuery<T> umgewandelt werden. Folgender Code demonstriert die asynchrone Abfrage:
1: var query = from p in ctx.Products
2: select p;
3:
4: var dataQuery = ( DataServiceQuery<Product> ) query;
5:
6: dataQuery.BeginExecute( OnLoadProductsComplete, dataQuery );
Die Methode OnLoadProductsComplete letztlich, ist dafür verantwortlich die Ergebnisse zu verwerten. Der folgende Code zeigt wie man dann die Daten auslesen kann:
1: private void OnLoadProductsComplete( IAsyncResult ar )
2: {
3: var dataQuery = ( DataSeviceQuery<Product> ) ar.AsyncState;
4:
5: var query = dataQuery.EndExecute( ar );
6:
7: foreach( var item in query )
8: {
9: // to whatever has to be done
10: }
11: }
ADO.NET Data Service im gleichen Projekt
Was nirgends dokumentiert ist und vermutlich ein Bug ist (ich konnte es noch nicht genauer verifizieren), ist die Tatsache, dass in der jetzigen Beta der Data Service relativ angesprochen werden muss. Sprich, dieser sollte im gleichen Projekt wie das Silverlight Web Projekt liegen. Alles andere hat bei mir auf der Maschine nur einen Fehler beim Aufruf vom Invoke des Proxies ergeben (callOpen error). Um den Proxy mit der relativen URI zu instanzieren nutzt man einen entsprechenden Konstruktor:
1: var ctx = new ModelEntitiesProxy( new Uri( "test.svc", UriKind.Relative ) );
Vielleicht gibt es ein Workaround für die absolute Adressierung, ausserhalb des Silverlight Web Projektes. Wenn jemand hier einen Link hat, ich wäre dankbar.
So, nun konnte ich das Projekt an den Service anbinden und mit den Daten arbeiten. Subjektiv gesehen ist die Performance nicht optimal zwischen dem Silverlight Projekt und dem Data Service. Es kommt mir träge vor, ist allerdings nur ein Subjektiver Eindruck, nicht durch Zahlen belegt. Abschliessend bleibt noch zu sagen, das die Beta durchaus für eine Evaluation eingesetzt werden kann, wobei man die Performance mal ausser Acht lassen sollte. Hier wird sich mit Sicherheit im Hinblick auf das Release noch was tun.