Silverlight 4.0 silverlight上的RIA服务异步调用链接

Silverlight 4.0 silverlight上的RIA服务异步调用链接,silverlight-4.0,mvvm,wcf-ria-services,Silverlight 4.0,Mvvm,Wcf Ria Services,所以我正试图改变我对MVVM和RIA服务的看法。但我很快就意识到他们不是在卖它 我可以让事情发生,但一切似乎都很丑陋。例如,我有一个视图模型,它需要从多个表等加载一组数据 我当前的aproach,链异步操作。这闻起来真难闻: _Model.GetSomethingById(Id, result => { _saveIt = result; _Model.GetSomethingElse(result2

所以我正试图改变我对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的预期工作方式吗?我错过了一些东西


当然,我可以在服务端的查询中包含所有内容,如果所有内容都相关的话。但那也很难闻。

这没什么错。如果愿意,可以创建单独的事件处理程序,使代码更美观。还要确保检查每个响应是否有错误。

没有任何错误。如果愿意,可以创建单独的事件处理程序,使代码更美观。还要确保检查每个响应上的错误。

这基本上就是您的代码应该如何与MVVM和RIA服务一起工作。不过,我还有一些建议:

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

  • 在ria服务中,当您等待来自服务器的数据时,通常会有一个绑定到ViewModel中bool属性的
    BusyIndicator
    控件。这有助于在初始化后等待来自服务器的数据时GUI的外观

  • 如果您正在做任何类型的数据表,我强烈推荐RIA Services 1.0 SP1,它有一些内置的
    DomainCollectionView
    DomainCollectionViewLoader
    类用于处理分页、绑定、,等等,我在圈子里转了一会儿,试图根据一些早期的论坛帖子自己实现这个,直到我发现它包含在SP1中


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

这基本上就是您的代码与MVVM和RIA服务一起工作的方式。不过,我还有一些建议:

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

  • 在ria服务中,当您等待来自服务器的数据时,通常会有一个绑定到ViewModel中bool属性的
    BusyIndicator
    控件。这有助于在初始化后等待来自服务器的数据时GUI的外观

  • 如果您正在做任何类型的数据表,我强烈推荐RIA Services 1.0 SP1,它有一些内置的
    DomainCollectionView
    DomainCollectionViewLoader
    类用于处理分页、绑定、,等等,我在圈子里转了一会儿,试图根据一些早期的论坛帖子自己实现这个,直到我发现它包含在SP1中


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

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

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
我有一本书


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

我真的很喜欢Visual Studio添加的异步支持。bits是早期的,但是语法要好得多。看起来像这样

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
我有一本书


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

通过使用协同程序,您可以使代码更加干净。将下面的代码与问题中包含的链接示例进行比较

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);
    }
}
public IEnumerable Activate()
{
var action=build.Query(service=>service.Authenticate(login,password));
收益回报作用;
if(!action.Result.Success)
屈服断裂;
var user=action.Result.user;
action=build.Query(服务=>service.GetIssues(用户));
收益回报作用;
foreach(发布每个正在运行的结果)
{
问题。添加(每个);
}
}

阅读以下内容:

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

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);
    }
}
public IEnumerable Activate()
{
var action=build.Query(service=>service.Authenticate(login,password));
收益回报作用;
if(!action.Result.Success)
屈服断裂;
var user=action.Result.user;
action=build.Query(服务=>service.GetIssues(用户));
收益回报作用;
foreach(发布每个正在运行的结果)
{
问题。添加(每个);
}
}

阅读以下内容:

看起来非常好,而且更干净。看起来非常好,而且更干净。我所说的初始化网格等,是指将数据获取到绑定属性,而不是直接映射。我所说的初始化网格等,是指将数据获取到绑定属性,而不是直接映射。