RIA обслуживает асинхронные вызовы на Silverlight - PullRequest
1 голос
/ 31 августа 2011

Так что я пытаюсь перевернуть голову с сервисами MVVM и RIA. Но я быстро понимаю, что это не так, как они продают.

Я могу заставить вещи случиться, но все кажется уродливым. Например, у меня есть модель представления, которая требует загрузки данных из нескольких таблиц и т. Д.

Мой текущий подход, цепочка асинхронных операций. Это очень плохо пахнет:

_Model.GetSomethingById(Id, result =>
            {
                _saveIt = result;
                _Model.GetSomethingElse(result2 =>
                    {
                        _saveit2 = result2;
                        //now i have all the data, can finally work on it.
                        //Initialize Grids, tables, input etc...
                    });
            });

Это предполагаемый способ работы с RIA? Я что-то упускаю.

Конечно, я могу включить все в запрос на стороне службы, то есть, если все связано. Но это также пахнет плохо.

Ответы [ 4 ]

3 голосов
/ 31 августа 2011

Это в основном то, как ваш код должен работать с MVVM & RIA Services.Однако у меня было бы еще несколько советов:

  • Обычно инициализация гридов и т. Д. После того, как вы получили данные, не запускаются из вашей модели представления.Вместо этого это обычно делается через связывание с вашим XAML.То есть, если у вас есть один объект Entity в вашей ViewModel, к которому вы привязываете, было бы предпочтительно иметь экземпляр по умолчанию, а затем скопировать содержимое объекта из результата в _saveIt в вашем примере.Это приведет к тому, что ваша привязка в элементах управления XAML будет просто автоматически обновлена.

  • Обычно в сервисах ria имеется элемент управления BusyIndicator, который привязан к свойству bool в вашей ViewModel, пока выждем данных с сервера.Это может помочь с появлением графического интерфейса пользователя во время ожидания данных с сервера после инициализации.

  • Если вы используете какой-либо объект DataTables, я настоятельно рекомендую RIA Services1.0 SP1, здесь есть некоторые встроенные классы DomainCollectionView и DomainCollectionViewLoader для обработки подкачки, связывания и т. Д. Я некоторое время крутился кругами, пытаясь реализовать это самостоятельно, основываясь на некоторых ранних сообщениях на форуме, пока не обнаружил, что он был включенв SP1.

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

2 голосов
/ 31 августа 2011

Мне очень нравится поддержка Async, которую добавляет Visual Studio.Биты рано, но синтаксис намного лучше.Выглядит примерно такзнать, обновили ли они это еще.Это стоит проверить, хотя.

0 голосов
/ 05 сентября 2011

Вы можете сделать свой код намного чище, используя сопрограммы. Сравните приведенный ниже код с примером цепочки, который вы включили в свой вопрос.

public IEnumerable<IAction> Activate()
{
    var action = build.Query(service => service.Authenticate(login, password));
    yield return action;

    if (!action.Result.Success)
        yield break;

    var user = action.Result.User;

    action = build.Query(service => service.GetIssues(user));
    yield return action;

    foreach (Issue each in action.Result)
    {
        Issues.Add(each);
    }
}

Прочитайте это: http://www.codeproject.com/KB/silverlight/FixingAllAsync.aspx

0 голосов
/ 31 августа 2011

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

...