2011-10-19 52 views
2

This answer發佈的響應式爲this questionWCF代理使用情況

它現在有點高於我的頭,但是應該在客戶端代理類中使用「高階函數」嗎?這是正確的用法嗎?:

public class MyProxy 
{ 
    readonly IMyService service = 
     new ChannelFactory<IMyService>("IMyService").CreateChannel(); 

    public ResponseObject Foo(RequestObject request) 
    { 
     return UseService((IMyService service) => 
      service.Bar(request)); 
    } 

    T UseService<T>(Func<IIssueTrackerService, T> code) 
    { 
     bool error = true; 

     try 
     { 
      T result = code(issueTrackerChannel); 
      ((IClientChannel)issueTrackerChannel).Close(); 
      error = false; 
      return result; 
     } 
     finally 
     { 
      if (error) 
      { 
       ((IClientChannel)issueTrackerChannel).Abort(); 
      } 
     } 
    } 
} 

我真的很想找的是一些指導,這是正確的方法來做到這一點。

回答

1

這實際上並不壞。也許你可以改爲ICommunicationObject,因爲你的主機也需要相同的代碼。

思考它的方法是接近友好的電話。請完成我的電話並將代理返回到連接池。中止是「我不在乎,關閉代理,因爲它已經死了,並且將它從池中移除,因爲它已經死了」。

根據您的代碼,如果可能的話,您可能需要從函數調用部分抽象出代碼中的「WCF代理」部分。這樣你可以單獨測試你的應用程序邏輯與WCF代理代碼分開。

您可能需要查看try {} catch(CommunicationException),以便您可以將WCF異常單獨處理爲應用程序級別異常,而不是finally。

try 
{ 
    try 
    { 
     proxy.call(); 
     //app logic 

     ((ICommunicationObject)proxy).Close(); 
    } 
    catch (SomeAppException) 
    { 
    //recover app exception 
    } 
} 
catch (CommunicationException) 
{ 
    ((ICommunicationObject)proxy).Abort(); 
}