Silverlight 4.0 silverlight上的RIA服务异步调用链接
所以我正试图改变我对MVVM和RIA服务的看法。但我很快就意识到他们不是在卖它 我可以让事情发生,但一切似乎都很丑陋。例如,我有一个视图模型,它需要从多个表等加载一组数据 我当前的aproach,链异步操作。这闻起来真难闻: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
_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属性的
控件。这有助于在初始化后等待来自服务器的数据时GUI的外观BusyIndicator
- 如果您正在做任何类型的数据表,我强烈推荐RIA Services 1.0 SP1,它有一些内置的
和DomainCollectionView
类用于处理分页、绑定、,等等,我在圈子里转了一会儿,试图根据一些早期的论坛帖子自己实现这个,直到我发现它包含在SP1中DomainCollectionViewLoader
总的来说,你在正确的轨道上。当您从XAML进行绑定时,RIA服务中有很多异步代码可以很好地处理。这基本上就是您的代码与MVVM和RIA服务一起工作的方式。不过,我还有一些建议:
- 通常,在检索数据后,不会从ViewModel触发网格等的初始化。相反,它通常是通过与XAML绑定来完成的。例如,如果要绑定到的ViewModel中有一个实体对象,最好有一个默认实例,然后将实体的内容从result复制到示例中的saveIt。这将导致XAML控件中的绑定自动更新
- 在ria服务中,当您等待来自服务器的数据时,通常会有一个绑定到ViewModel中bool属性的
控件。这有助于在初始化后等待来自服务器的数据时GUI的外观BusyIndicator
- 如果您正在做任何类型的数据表,我强烈推荐RIA Services 1.0 SP1,它有一些内置的
和DomainCollectionView
类用于处理分页、绑定、,等等,我在圈子里转了一会儿,试图根据一些早期的论坛帖子自己实现这个,直到我发现它包含在SP1中DomainCollectionViewLoader
总的来说,你在正确的轨道上。从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(发布每个正在运行的结果)
{
问题。添加(每个);
}
}
阅读以下内容:看起来非常好,而且更干净。看起来非常好,而且更干净。我所说的初始化网格等,是指将数据获取到绑定属性,而不是直接映射。我所说的初始化网格等,是指将数据获取到绑定属性,而不是直接映射。