Любой пример того, как использовать WCF RIA Services в приложении метро XAML? - PullRequest
1 голос
/ 08 марта 2012

Интересно, пытался ли кто-нибудь использовать службы WCF RIA в приложении на основе XAML. Если у вас есть блог или пример, пожалуйста, поделитесь.

1 Ответ

7 голосов
/ 02 июля 2012

На самом деле я сделал, и вот хитрость:)

Я добавил « Ссылка на услугу » к моей службе WCF, выставив ADO.NET Entity Framework *Модель 1006 *.Проблема заключается в том, что в приложении XAML / C # Metro выполнить следующий код не удается:

SampleEntities ctx = ((App)Application.Current).Context;
var query = from p in ctx.Products
              where p.Name == name
              select p;

foreach (Product p in query) /** this line fails **/
{
    // do stuff
}

Вот исключение, которое вы получите во время выполнения:

"Silverlight неПозволяет вам напрямую перечислять запрос службы данных. Это происходит потому, что перечисление автоматически отправляет синхронный запрос в службу данных. Поскольку Silverlight поддерживает только асинхронные операции, вы должны вместо этого вызвать методы BeginExecute и EndExecute, чтобы получить результат запроса, который поддерживает перечисление."} [System.NotSupportedException]: {" Silverlight не позволяет напрямую перечислять запрос службы данных. Это происходит потому, что перечисление автоматически отправляет синхронный запрос в службу данных. Поскольку Silverlight поддерживает только асинхронные операции, вместо этого необходимо вызватьМетоды BeginExecute и EndExecute для получения результата запроса, который поддерживает перечисление. "

Ах, это было бы слишком хорошо, чтобы быть правдой!

Как указано в исключении, вычтобы ваши серверные вызовы были асинхронными, как в Silverlight.

Вот пример того, как вы можете использовать службу RIA WCF в приложении C # Metro, делая это old school способом:

(...)
var query = from p in ctx.Products
            where p.Name == Name
            select p;

((DataServiceQuery<Product>)query).BeginExecute(OnLoadItemsCompleted, query);
(...)

private void OnLoadItemsCompleted(IAsyncResult result)
{
    var query = result.AsyncState as DataServiceQuery<Product>;
    IEnumerable<Product> response = query.EndExecute(result);

    foreach (Product o in response)
    {
         // Do stuff
    }
}

Теперь, используя .NET 4.5 и его новые await & async ключевые слова, вы можете получить то же самоерезультат, не допуская разбивки вашего кода на все эти маленькие методы обратного вызова.

Пример:

async void GetProducts()
{
    SampleEntities ctx = ((App)Application.Current).Context;
    var query = from p in ctx.Products
                  where p.Name == name
                  select p;
    DataServiceQuery<Product> dqs = (DataServiceQuery<Product>)(query);
    TaskFactory<IEnumerable<Product>> tf = new TaskFactory<IEnumerable<Product>>();
    myListView.ItemsSource = await tf.FromAsync(dqs.BeginExecute(null, null), 
                               iar => dqs.EndExecute(iar));
}

Использование любого из двух последних методов работало хорошо для меня:)

...