2010-04-08 61 views
3

我想重寫生成的代理(ClientBase)的Dispose方法,因爲處置代理時會調用Close並在通道出現故障時拋出異常。WCF:使用分部類覆蓋客戶端的Dispose方法是否安全?

我想出的唯一方法是創建一個部分類對我生成的代理,使之從IDisposable繼承:

public partial class MyServiceProxy : IDisposable 
    { 
     #region IDisposable Members 

     public void Dispose() 
     { 
      if (State != System.ServiceModel.CommunicationState.Faulted) 
       Close(); 
      else 
       Abort(); 
     } 

     #endregion 
    } 

我做了一些測試,我的Dispose方法確實調用。

您是否看到此策略的任何問題?

此外,我不喜歡這樣的事實,我必須爲每個生成的代理創建此部分類。

是很好,如果我能夠讓我的代理繼承一個基類...

回答

2

有與它沒有任何問題。以這種方式定製設計器生成的代碼正是部分類打算提供的功能,這是處理ClientBase上的破壞IDisposable實現的推薦方法之一。

至於必須爲每個WCF客戶端重新實現此代碼 - 不幸的是,如果您想要使用IDisposable模式,那麼是的。您可以將if/else塊提取爲實用程序方法,但您仍然必須爲每個塊創建部分類並覆蓋Dispose

鑑於上述過程相當繁瑣,許多人選擇使用Service Proxy Helper,因爲它不需要編寫任何新代碼。

我用一個稍作修改的版本,我自己:

public static class Service<TProxy> 
    where TProxy : ICommunicationObject, IDisposable, new() 
{ 
    public static void Using(Action<TProxy> action) 
    { 
     TProxy proxy = new TProxy(); 
     bool success = false; 
     try 
     { 
      action(proxy); 
      proxy.Close(); 
      success = true; 
     } 
     finally 
     { 
      if (!success) 
      { 
       proxy.Abort(); 
      } 
     } 
    } 
} 

允許寫這種代碼:

Service<MyServiceClient>.Using(svc => svc.PerformOperation()); 

或者:

Service<MyServiceClient>.Using(svc => 
{ 
    var result = svc.PerformOperation(); 
    ProcessResult(result); 
}); 

注:WCF代理價格昂貴創造,所以你通常想盡量讓他們活着,而不是創造和處置他們每一個幾秒鐘(或更多)。這適用於不經常使用的客戶端。

+0

我喜歡你的版本,這樣我就不需要創建一個類爲每個代理。謝謝! – pdiddy 2010-04-09 01:57:45