你將如何構造在Silverlight應用程序中調用wcf服務的代碼?Silverlight使用Wcf服務的最佳實踐?
只使用一次實例化的wcf服務代理(又名單身人士)並在整個SL應用程序中使用它? 如果是這樣,您是如何解決ws-call-completed事件的取消訂閱控制的?
或
爲每個ws-call創建wcf服務代理?那麼你在哪裏關閉代理?
你將如何構造在Silverlight應用程序中調用wcf服務的代碼?Silverlight使用Wcf服務的最佳實踐?
只使用一次實例化的wcf服務代理(又名單身人士)並在整個SL應用程序中使用它? 如果是這樣,您是如何解決ws-call-completed事件的取消訂閱控制的?
或
爲每個ws-call創建wcf服務代理?那麼你在哪裏關閉代理?
這裏的應用程序結構我發現可行的:
對於每一個服務客戶端部分類我有另一個產生局部類,其中每一個服務方法我有一個返回的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棧的(更容易嘲笑,更容易測試)此外,這些模型類照顧:
能否請您解釋一下在由服務推動初始加載