2010-07-21 83 views
1

我通常會嘗試將我的Web服務調用封裝在我的客戶端應用程序中。Properway封裝異步Web服務通信

不是這樣:

public Guid FindUserIDSelected(string userName) 
{ 
    MyWebServiceReference service = new MyWebServiceReference(GetEndpointBasedOnEnv(Env)); 
    return service.GetUserIDFromName(userName); 
} 

我有一個封裝與Web服務通信的靜態類。它通過確定環境(以及其他類似的東西)來處理端點解析。

所以上面的代碼更改爲如下所示:

public Guid FindUserIDSelected(string userName) 
{ 
    return Communication.GetUserIDFromName(userName); 
} 

但現在我有一個問題。 Silverlight只支持異步調用(至少就我所見)。所以調用Web服務,然後返回封裝調用中的值不起作用。

我能想出的傳遞是在通信類用於已完成事件的委託最好的:

private Guid foundUserID; 

public void FindUserIDSelected(string userName) 
{ 
    Communication.GetUserIDFromName(userName, GetUserIDCompleted); 
} 

private void QuestionRecieved(object sender, GetUserIDFromNameCompletedEventArgs e) 
{ 
    foundUserID= e.Result(); 
} 

這有幾個問題(在我看來)。

  1. 我現在的Web服務已經打破封裝要素(完成的呼叫是真正的Web服務的回報。我不希望我的課的其餘部分不得不關心服務)。
  2. 我不得不在課堂上暴露我的結果(foundUserID)。

我是不是太死板?這足夠好嗎?有沒有更好的辦法?

我是誰擁有這個問題的唯一一個?

回答

0

在我看來,它最好使用三項賽從您的通訊類,特別是如果你有一些東西一樣[EventAggregator]1,這樣你就可以過濾事件根據您的具體參數

下面是代碼片段,這可能對您有所幫助。

公共靜態類通信 {

public static event EventHandler<MyEventArgs> ServiceCallComplete; 

    public static void InvokeMyAcionComplete(MyEventArgs e) 
    { 
     EventHandler<MyEventArgs> handler = ServiceCallComplete; 
     if (handler != null) handler(null, e); 
    } 

    public static void CallService() 
    { 
     //Performed async call 

     // Fire the event to notify listeners 
     OnServiceCalled(); 
    } 

    private static void OnServiceCalled() 
    { 

     InvokeMyAcionComplete(new MyEventArgs()); 

    } 



} 

public class ClientCode 
{ 
     public void CallService() 
     { 
      Communication.CallService(); 

      //Subscribe to the event and get notified when the call is complete 
      Communication.ServiceCallComplete += OnServiceCalled; 
     } 

    private void OnServiceCalled(object sender, MyEventArgs e) 
    { 
      //MyEventArgs is your customized event argument 

      //Do something with the result 
    } 
} 

希望這有助於