2011-03-02 67 views
0

我正在使用Web服務更新第三方數據庫中某些用戶的信息。
這個信息通常需要更新我的數據庫(我知道這聽起來不太好,但我無能爲力。)。
最近我們開始在Web服務的數據庫和我們的本地數據庫之間出現各種差異問題,所以現在我正在尋找一種方法來確保我的本地數據庫只在Web服務調用返回成功時才更新。
這樣做的一個主要問題是Web服務可能以多種方式返回成功(例如bool,枚舉等),當然每個方法都有不同的簽名。確保僅在其他方法成功完成時運行方法

例如:
我有Web服務的方法,如:

public bool ChangeDetails(User user) 

和:

public SuccessStatus RemoveUser(long userId) 

其中僅如果成功完成將觸發一個電話:

public bool UpdateUserDetails(long userId string userName) 

和:

public bool RemoveUser(long userId) 

(我只是爲了證明這些方法的分歧..)

我想要做的是,將「配合」每個WS的方法的一個DB方法,通過使用一種機制單一的方法(但也許有一個更好的方法來確保數據庫的方法只有在WS方法成功完成時纔會執行)。
解決這個問題的最佳方法是編寫一個方法,將其稱爲UpdateWSandDB,它接收WS方法的委託,它的成功類型(例如bool/enum),成功值,數據庫方法名稱以及每個方法的參數。 ..你可以看到這是一個非常尷尬的做法。

有沒有更整潔更優雅的方式?

謝謝。

回答

0

創建一個輔助類的Web服務這樣的:

public class ChangeDetailsServiceHelper 
{  
    /// <summary> 
    /// ChangeDetails 
    /// </summary> 
    /// <param name="callback"></param> 
    public void ChangeDetails(Action<User, Exception> callback) 
    { 
     var proxy = new ChangeDetailsServiceClient(); 

     try 
     { 
      proxy.ChangeDetailsCompleted += (sender, eventargs) => 
      { 
       var userCallback = eventargs.UserState as Action<User, Exception>; 
       if (userCallback == null) 
        return; 

       if (eventargs.Error != null) 
       { 
        userCallback(null, eventargs.Error); 
        return; 
       } 
       userCallback(eventargs.Result, null); 
      }; 
      proxy.ChangeDetailsAsync(callback); 
     } 
     catch (Exception ex) 
     { 
      proxy.Abort(); 
     } 
     finally 
     { 
      if (proxy.State != CommunicationState.Closed) 
      { 
       proxy.CloseAsync(); 
      } 
     } 
    } 
} 

然後在你的代碼調用Web服務:

var changeDetails= new ChangeDetailsServiceHelper(); 
changeDetails.ChangeDetails((result, error) => 
{ 
    if (result != null && error == null) 
    { 
     //everything ok, call next webservice here 
     //changeDetails.NEXT WEB SERVICE METHOD HERE... 
    } 
    else 
    { 
     //error occured! 
    } 
}); 
相關問題