RIA服务异步调用链接Silverlight

时间:2011-08-31 15:53:04

标签: silverlight-4.0 mvvm wcf-ria-services

所以我试图围绕MVVM和RIA服务扭曲局面。但我很快意识到它并不像他们卖掉它。

我可以让事情发生但一切看起来都很难看。例如,我有一个视图模型,需要从多个表等加载一组数据。

我目前的aproach,链异步操作。这闻起来很糟糕:

_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 个答案:

答案 0 :(得分:3)

这基本上是你的代码应该如何与MVVM和& RIA服务。不过我会提供一些提示:

  • 通常,在您检索数据后,您的ViewModel不会触发网格等的初始化。相反,它通常通过与您的XAML绑定来完成。即,如果您绑定了ViewModel中的单个Entity对象,则最好有一个默认实例,然后将实体内容从result复制到示例中的_saveIt。这将导致您的XAML控件中的绑定自动更新。

  • 在您正在等待来自服务器的数据时,ria服务中常见的是BusyIndicator控件绑定到ViewModel中的bool属性。这可以帮助您在初始化后等待来自服务器的数据时出现GUI。

  • 如果你正在做任何类型的DataTables,我强烈推荐RIA Services 1.0 SP1,它有一些内置的DomainCollectionViewDomainCollectionViewLoader类来处理分页,绑定等。基于一些早期的论坛帖子,我在圈子里试了一段时间试图实现这个,直到我发现它包含在SP1中。

一般来说,你走在正确的轨道上。当您从XAML进行绑定时,RIA服务中只有很多异步代码可以很好地处理。

答案 1 :(得分:2)

我非常喜欢Visual Studio正在添加的异步支持。这些位是早期的,但语法要好得多。它看起来像这样。

await TaskEx.WhenAll(
    this._context.Load(this._context.GetRedEntitiesQuery()).AsTask(),
    this._context.Load(this._context.GetGreenEntitiesQuery()).AsTask(),
    this._context.Load(this._context.GetBlueEntitiesQuery()).AsTask()
    );
// Now do stuff

我有post about it here

第一个CTP存在一些已知的兼容性问题,我不知道他们是否已经更新了它。不过,值得一试。

答案 2 :(得分:0)

这没什么不对。如果您愿意,可以创建单独的事件处理程序以使代码更漂亮。还要确保检查每个响应的错误。

答案 3 :(得分:0)

使用协同程序可以使代码更清晰。将下面的代码与您在问题中包含的链接示例进行比较。

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