2010-10-20 42 views
3

我已經編寫了一個擴展方法用於WCF服務,它將所有的處理和異常處理邏輯保存在一個地方。該方法如下:使用擴展方法調用WCF服務

public static TResult CallMethod<TChannel, TResult>(
    this ClientBase<TChannel> proxy, 
    Func<TResult> func) where TChannel : class 
{ 
    proxy.ThrowIfNull("proxy"); 
    func.ThrowIfNull("func"); 

    try 
    { 
     // set client credentials 
     return func(); 
    } 
    finally 
    { 
     if (proxy != null) 
     { 
      try 
      { 
       if (proxy.State != CommunicationState.Faulted) 
       { 
        proxy.Close(); 
       } 
       else 
       { 
        proxy.Abort(); 
       } 
      } 
      catch (CommunicationException) 
      { 
       proxy.Abort(); 
      } 
      catch (TimeoutException) 
      { 
       proxy.Abort(); 
      } 
      catch (Exception) 
      { 
       proxy.Abort(); 
       throw; 
      } 
     } 
    } 
} 

的方法將被用於這樣的:

public int CreateBusinessObject(BusinessObject item) 
{ 
    MyServiceClient proxy = new MyServiceClient(); 
    return proxy.CallMethod(() => proxy.CreateBusinessObject(item)); 
} 

我的問題還真是,這是否會爲它創建服務代理的靜態方法更好呢?我對目前的實施情況略有擔心。代理的構建是否應該在try/catch中?我目前的理解是,如果構造函數失敗,則無論如何都不能處理。

回答

2

如果構造函數失敗,整個對象處於無效狀態。你不應該擔心在這種情況下處置。

一個很好的測試,這是當您執行以下會發生什麼:

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (new TestClass()) 
     { 
      Console.WriteLine("In using"); 
     } 
    } 

    class TestClass : IDisposable 
    { 
     public TestClass() 
     { 
      throw new Exception(); 
     } 

     public void Dispose() 
     { 
      Console.WriteLine("Disposed"); 
     } 
    } 
} 

結果是處分權從來沒有被達到。當構造函數失敗時會發生這種情況。

+2

好點。我應該知道做這樣的事情。謝謝。 – 2010-10-20 09:43:34