Welcome to MSDN Blogs Sign in | Join | Help

News

  • Microsoft PDC 2008

    Mit Dariusz quatschen

    Add to Technorati Favorites

     Dariusz quatscht - Die Podcast Show

    Subscribe with iTunes

    Search my blog using Live search

    These postings are provided "AS IS" with no warranties, and confer no rights. Use of included code samples are subject to the terms specified at Microsoft - Information on Terms of Use

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.
Posted: Friday, June 13, 2008 9:23 AM by dparys

Comments

No Comments

Anonymous comments are disabled
Page view tracker