views:

175

answers:

2

I've start using prism with silverlight 3, but, we are trying to implement it to work with ADO.NET DataServices. The "DataServiceQuery" query type required to use with Silverlight, requires a Asyncronous call to be fired after the query. This will break ous Prism Pattern by what I can see. Any ideas to get only the data of the query to use in Prism Pattern? Correct-me anyone if i'm wrong!

A: 

Making an Asynchronous call to your server doesn't break "Prism Pattern". When your view needs to query the server, its viewmodel fires an asynchronous request and provides a callback. Once callback is called, it handles the result and updates whatever properties it exposes to a view. This will result in view updating according to bindings you set up in your xaml.

PL
A: 

PL is exactly right. There's really no patterns that Prism encourages that are incompatible with ADO.NET Data Services. There are just a few things you should know.

Here's a small sample. It's a little tricky... the complete event will sometimes fire outside of the UI thread, so you have to handle it with the dispatcher (at least in SL2 you did):

public class MyViewModel : BaseViewModel
{

     public Customer CustomerResult
     {
         ...
     }

     NorthwindEntities svcContext = null;
     public MyViewModel()
     {
            svcContext =
                new NorthwindEntities(new Uri("Northwind.svc", UriKind.Relative));

            DataServiceQuery<Customers> query =
                svcContext.Customers.Expand("Orders");

            // Begin the query execution.
                query.BeginExecute(WorkComplete, query);

     }



     private void WorkComplete(IAsyncResult result)
     {
          DataServiceQuery<Customers> query =
                    result.AsyncState as DataServiceQuery<Customers>;

          Customers returnedCustomer =
                    query.EndExecute(result).FirstOrDefault();

          //Execute with the dispatcher
          Dispatcher.CurrentDispatcher.BeginInvoke( () =>
          {
               CustomerResult = returnedCustomer;
          });
     }
}

Of course there is no exception handling in here, but you get the picture hopefully.

Anderson Imes
Well, the beginInvoke Method is missing and at the momment i'm not figuring out why. but thanks for the reply
Diego
On the Dispatcher? That doesn't make much sense.
Anderson Imes
Oh sorry... I forgot to include CurrentDispatcher. I'm modifying the code.
Anderson Imes