2010-04-30 79 views
3

你將如何構造在Silverlight應用程序中調用wcf服務的代碼?Silverlight使用Wcf服務的最佳實踐?

只使用一次實例化的wcf服務代理(又名單身人士)並在整個SL應用程序中使用它? 如果是這樣,您是如何解決ws-call-completed事件的取消訂閱控制的?

爲每個ws-call創建wcf服務代理?那麼你在哪裏關閉代理?

回答

7

這裏的應用程序結構我發現可行的:

  • 應用被分成模塊(棱鏡,但可以是任何東西) - 每垂直的功能模塊。
  • 每個模塊都有自己的一套服務客戶端類(由slsvcutil生成)
  • 對於每一個服務客戶端部分類我有另一個產生局部類,其中每一個服務方法我有一個返回的IObservable一個版本。

    E.g.如果我的服務客戶端有方法GetAllMyDataAsync()和事件GetAllMyDataCompleted生成的方法簽名將爲IObservable<MyDataDto[]> GetMyData()此方法將處理訂閱/取消訂閱事件,身份驗證,錯誤處理和其他基礎結構問題。

    這樣的Web服務調用變得簡單:

    new MyServiceClient().GetAllMyData().Subscribe(DoSomethingWithAllMyData)

    有了這個,我可以很容易地從多個請求,例如加入數據(嚴格用於演示目的,不要試圖在這個真正的應用程序):一旦應用程序變得更加複雜

    var des = (from d in new MyServiceClient().GetMyDataItem() 
          from e in new MyServiceClient().GetDataItemEnrichment(d) 
          select new EnrichedData { Data = d, Enrichment = e}); 
    des.Subscribe(DoSomethingWithEnrichedData); 
    
  • (如數據是由多個組件共享,添加消息動態更新最初檢索到的數據等。 )在堆棧中添加另一個元素很有幫助 - Model。

    因此,如果我有一個服務MyDataService我會有一個模型類叫MyDataServiceModel。它將作爲singleton在容器中註冊,並將被注入到需要它的視圖模型中。這樣的ViewModels聊到這個類,當他們需要的數據(因此而不是調用MyServiceClient.GetAllMyData它會調用MyDataServiceModel.GetAllMyData

    這樣的ViewModels是完全獨立的WCF棧的(更容易嘲笑,更容易測試)此外,這些模型類照顧:

    • 數據變換從/向DTO
    • 豐富和組合數據(一個模型方法可以從一個以上的請求加入數據)
    • 處理問題等節流在一個(例如典型的場景中,用戶選擇的事組合框,它導致了重新要求發送到服務器以檢索該選擇的數據,同時該請求正在被執行,用戶進行了另一次更改,但由於某些原因,響應失序)等。通過WCF數據會話
+1

能否請您解釋一下在由服務推動初始加載

  • 結合數據拉,你如何生成返回的IObservable服務方法的版本?用T4還是別的? – Harm 2012-04-09 10:05:27