2011-08-31 113 views
1

所以我試圖扭曲我的頭繞MVVM和RIA服務。但我很快意識到它不像他們出售它。RIA服務異步調用silverlight鏈接

我可以讓事情發生,但一切似乎醜陋。例如,我有一個視圖模型,需要一組數據從多個表格等加載。

我目前的方法,鏈式異步操作。這種氣味真的很糟糕:

_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一起工作的預期方式嗎?我錯過了一些東西。

當然,我可以在服務端的查詢中包含所有內容,也就是說,萬物相關。但是這也味道不好。

回答

3

這基本上是你的代碼應該如何與MVVM & RIA服務一起工作。我想有幾個技巧,但是:

  • 通常情況下,電網的初始化等,檢索完數據後,不會從您的視圖模型觸發。相反,它通常通過綁定你的XAML來完成。也就是說,如果您的ViewModel中有一個綁定的實體對象,那麼最好是有一個默認實例,然後將結果中的實體內容複製到您的示例中的_saveIt。這會導致您的XAML控件中的綁定自動更新。

  • 在您等待來自服務器的數據時,它在ria服務中共有一個BusyIndicator控件,該控件綁定到ViewModel中的bool屬性。這可以幫助您在初始化後等待服務器中的數據時顯示GUI。

  • 如果你做任何形式的數據表,我會強烈建議RIA服務1.0 SP1,這有內建的DomainCollectionViewDomainCollectionViewLoader類處理分頁,裝訂,等我去轉轉一段時間努力基於一些早期的論壇帖子自己實現這個功能,直到我發現它包含在SP1中。

總的來說,你是在正確的軌道上。 RIA服務中只有很多異步代碼,當您從XAML進行綁定時,處理得很好。

+0

我的意思被初始化網格什麼,等等,該數據是越來越向綁定propertys,它不是直接的映射。 – GriffinHeart

0

這沒什麼不對。如果您願意,您可以創建單獨的事件處理程序以使代碼更漂亮。另外請確保檢查每個響應中的錯誤。

2

我真的很喜歡Visual Studio添加的Async支持。這些位很早,但語法要好得多。它看起來像這樣。

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存在一些已知的兼容性問題,我不知道他們是否已經更新過它。雖然這很值得一看。

+0

看起來非常好,而且更乾淨。 – GriffinHeart

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