2011-10-19 12 views
2

This answerthis questionへの返信です。WCFプロキシの使用

これは私の頭より少し上ですが、クライアントプロキシクラス内で使用されるはずの「高次関数」ですか?この正しい使用法ですか?:

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 Proxy"部分を関数呼び出し部分から抽象化することができます。こうすることで、アプリケーションロジックをWCFプロキシコードとは別に単体テストできます。

try {} catch(CommunicationException)を見れば、最終的にではなくアプリケーションレベルの例外に対してもWCF例外を個別に扱うことができます。

すなわち

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

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