所以我试图围绕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合作的预期方式吗?我错过了什么。
当然,我可以在服务端包含查询中的所有内容,即如果每个人都相关。但那也闻起来很糟糕。
答案 0 :(得分:3)
这基本上是你的代码应该如何与MVVM和& RIA服务。不过我会提供一些提示:
通常,在您检索数据后,您的ViewModel不会触发网格等的初始化。相反,它通常通过与您的XAML绑定来完成。即,如果您绑定了ViewModel中的单个Entity对象,则最好有一个默认实例,然后将实体内容从result复制到示例中的_saveIt。这将导致您的XAML控件中的绑定自动更新。
在您正在等待来自服务器的数据时,ria服务中常见的是BusyIndicator
控件绑定到ViewModel中的bool属性。这可以帮助您在初始化后等待来自服务器的数据时出现GUI。
如果你正在做任何类型的DataTables,我强烈推荐RIA Services 1.0 SP1,它有一些内置的DomainCollectionView
和DomainCollectionViewLoader
类来处理分页,绑定等。基于一些早期的论坛帖子,我在圈子里试了一段时间试图实现这个,直到我发现它包含在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
第一个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