Услуги WCF RIA - Загрузка нескольких объектов - PullRequest
2 голосов
/ 09 марта 2010

Я ищу шаблон для решения следующей проблемы, которая, как мне кажется, является обычной.

Я использую службы WCF RIA для возврата нескольких объектов клиенту при начальной загрузке. Я хочу, чтобы обе сущности загружались асинхронно, чтобы не блокировать пользовательский интерфейс, и я хотел бы использовать службы RIA для этого.

Мое решение, приведенное ниже, похоже, работает. Буду ли я сталкиваться с проблемами / ограничениями при таком подходе? Есть ли лучший шаблон для этого?

Спасибо!


//create proxy to Domain Service  
var proxy = new RIAService.Web.DomainContext();

//call service; fire event when Presentation entities have been returned
var loadPresentations = proxy.Load(proxy.GetPresentationsQuery());
loadPresentations.Completed += new EventHandler(loadPresentations_Completed);

//call service; fire event when Topics entities have been returned
var loadTopics = proxy.Load(proxy.GetTopicsQuery());
loadTopics.Completed += new EventHandler(loadTopics_Completed);

void loadTopics_Completed(object sender, EventArgs e)
{
  //bind topic entities to XAML
}

void loadPresentations_Completed(object sender, EventArgs e)
{
  //bind presentation entities to XAML
}

Ответы [ 3 ]

1 голос
/ 03 августа 2011

Ваше решение должно работать как есть. В вашем коде есть одна небольшая хитрость - вы вызываете асинхронный метод на сервере, а после этого связываете событие OnCompleted. Если вызов сверхбыстрый и заканчивается до того, как событие будет связано, вы не увидите сущностей.

По моему опыту, это никогда не было проблемой (в 99,99% случаев это работает нормально), но просто для того, чтобы иметь чистый код, вы можете предоставить обратный вызов внутри метода Load, например

proxy.Load(proxy.GetPresentationsQuery(), op => { here work with op.Value });

Подсказка: для загрузки сущностей в ObservableCollection я создал собственный класс, производный от ObservableCollection, который принимает DomainContext и DomainQuery в качестве параметров в ctor и способен загружать элементы с самого сервера. Кроме того, можно связать коллекцию в XAML, а загруженные объекты автоматически обновляются в графическом интерфейсе.

0 голосов
/ 25 сентября 2010

Это тот же шаблон, который я использовал в приложении Silverlight, которое выпускается с июня.Кажется, для меня это хорошо работает.В частности, он достаточно хорошо использует многопоточные внутренние серверы, поскольку каждый запрос объекта будет выполняться параллельно на сервере.

Рлодина предложила последовательно загружать объекты, что также работает.Я избегал этого в пользу повышения производительности параллельных операций.Но был случай, когда я был вынужден использовать последовательные операции.Это был тот случай, когда второй запрос должен был быть ограничен результатами первого.

Итак, чтобы прямо ответить на ваш вопрос, этот шаблон хорошо работал для меня.Это функционально и просто.Я всегда выступаю за то, чтобы делать самое простое, что могло бы сработать.

0 голосов
/ 19 апреля 2010

Не блестящее решение - но работает.

Загрузка всех операций в последовательном порядке. Начало следующей загрузки после завершения предыдущего события загрузки.

MyDomainContext proxy;

public void Initialize()
{
    //create proxy to Domain Service  
    proxy = new RIAService.Web.DomainContext();

    //load Presentation - LOAD STEP 1
    Load(proxy.GetPresentationsQuery(), LoadPresentations_Completed, null);
}


void LoadPresentations_Completed(LoadOperation<PresentationEntity> loadOp)
{
  if (loadOp.HasError)
  {
     //process error here
     loadOp.MarkErrorAsHandled = true;
  }
  else
  {
      - LOAD STEP 2
     var loadTopics = proxy.Load(proxy.GetTopicsQuery());
     loadTopics.Completed += new EventHandler(loadTopics_Completed);
  }
}


void loadTopics_Completed(object sender, EventArgs e)
{

  //bind presentation entities to XAML      
}

Удачи.

...