2010-10-06 129 views
0

我有一個類來處理我的應用程序中與我的WCF服務的所有交互,並且似乎MSDN認爲使用using)_語句與WCF很差 - 我可以看到爲什麼會這樣是不好的,並同意它(http://msdn.microsoft.com/en-us/library/aa355056.aspx)調用WCF服務的多種方法

我的問題是,他們建議的實現方法將意味着我有10個方法[10在我服務的公共方法]將具有相同的結構代碼,這當然不符合DRY委託 - 代碼看起來類似於以下內容:

try 
{ 
    results = _client.MethodCall(input parameteres); 
    _client.Close(); 
} 
catch (CommunicationException) 
{ 
    if (_client != null && _client.State != CommunicationState.Closed) 
    { 
     _client.Abort(); 
    } 
} 
catch (TimeoutException) 
{ 
    if (_client != null && _client.State != CommunicationState.Closed) 
    { 
     _client.Abort(); 
    } 
} 
catch (Exception ex) 
{ 
    if (_client != null && _client.State != CommunicationState.Closed) 
    { 
     _client.Abort(); 
    } 
    throw; 
} 

這還沒有任何日誌記錄,但當然,當我來開始記錄它,然後我將不得不在幾乎10個不同的地方添加日誌記錄工作

沒有任何人有任何提示我如何可以更有機會在這裏重用代碼

感謝

保羅

回答

5

我會使用一些通用的,可配置的異常處理組件,可以讓喜歡記錄基本的異常處理加工,再投擲等從實際脫鉤處理地點。這種組件的一個例子是微軟的Exception Handling Application Block

然後,你可以結束了這樣的代碼:

try 
{ 
    results = _client.MethodCall(input parameteres); 
    _client.Close(); 
} 
catch (Exception ex) 
{ 
    _client.CloseIfNeeded(); 
    if (!ex.Handle("Wcf.Policy")) throw; 
} 

其中CloseIfNeeded表示自定義擴展方法封裝WCF通道關閉邏輯和Handle異常方法調用的異常處理機構,傳遞一個應在此處應用的例外策略的名稱。

在大多數情況下,可以減少異常處理邏輯的代碼,一個體面的一兩行,給你幾個好處:

  • 的異常處理行爲,即時的可配置性(政策)
  • 擴展與自定義綁定到特定類型的異常和異常的政策
  • 更好的可管理性和代碼的可讀性的異常處理程序
+0

我認爲你有S中的解決方案uggested非常好。擴展方法的使用將使這非常有用 - 如果我擴展System.ServiceModel.ClientBase與CloseIfNeeded()你認爲這將是一個好的或壞的舉動? – stack72 2010-10-06 13:30:28

+1

如何爲'System.ServiceModel.ICommunicationObject'實現它?這將更符合該接口的架構意圖,該接口爲通信狀態管理提供原語。 – 2010-10-06 13:46:12

+0

虐待給了一個去 - 謝謝:) – stack72 2010-10-06 15:06:12