2009-06-15 14 views
3

私はWindows Mobileデバイスを使用してWebサービスを呼び出すプロジェクトに取り組んでいます。代理人署名/汎用代理人ですか?

サービスコールが失敗した場合、再試行するように指示する必要があるという要件があります。現在、Webサービスプロキシのすべてのメソッドを呼び出すサービスエージェントがあり、呼び出しが失敗した場合は、ユーザーに再試行を促し、再度呼び出しを試みるコードがあります。

public void MyServiceCall(string stringArg, bool boolArg, int intArg) 
{ 
    try 
    { 
     MyWebService.MyServiceCall(stringArg, boolArg, intArg); 
    } 
    catch(SoapException ex) 
    { 
     bool retry = //a load of horrid code to prompt the user to retry 
     if (retry) 
     { 
      this.MyServiceCall(stringArg, boolArg, intArg); 
     } 
    } 
} 

漁獲量のものは、そのスニペットに比べて、システム上の多くのメシエを検索し、CTRL-C CTRL-Vのパターンは、すべてのサービスコールでそれを複製するために使用されています:それは次のようになります。この重複したコードをメソッドにリファクタリングしたいのですが、メソッド呼び出しを再試行する最善の方法が不明です。私は新しいメソッドの引数としてデリゲートを持つことを考えていましたが、署名を知らないので、これを一般的な方法で行う方法がわかりません。誰も助けることができますか?ありがとう。

protected void Invoke(Action action) { 
    try { 
     action(); 
    } catch {...} // your long boilerplate code 
} 
protected T Invoke<T>(Func<T> func) { 
    try { 
     return func(); 
    } catch {...} // your long boilerplate code 
} 

が次にあなたが使用することができます:

public void MyServiceCall(string stringArg, bool boolArg, int intArg) 
{ 
    Invoke(() => MyWebService.MyServiceCall(stringArg, boolArg, intArg)); 
} 

と同様に、戻り値を持つメソッドのための他のバージョンを使用する

答えて

7

は、私はあなただけの二つの方法が必要だと思います。あなたがまたできた...ちょうど私の頭の上にコードを構成する

protected void Invoke(Action<MyService> action) { 
    using(MyService svc = new MyService()) { 
    try { 
     action(svc); 
    } catch {...} // your long boilerplate code 
    } 
} 
... 
public void MyServiceCall(string stringArg, bool boolArg, int intArg) 
{ 
    Invoke(svc => svc.MyServiceCall(stringArg, boolArg, intArg)); 
} 
+0

ありがとうございます。ここではC#2になっていますので、lambdaの代わりに匿名のメソッドを使用する必要がありますが、それが役に立ちます。 – Charlie

+0

十分に公正 - 理論は同じです; –

2

IDisposableの理由のために便利かもしれない - あなたがする必要がある場合は、デリゲートが引数としてサービス自体を取ることができますFuncが値を返すようなものを実装します。

public static void ExecuteServiceCall(Action serviceCall) { 
    while (true) { 
     try { 
      serviceCall(); 
      return; 
     } catch (SoapException ex) { 
      bool retry = // whaazzaaaaa!? 
      if (!retry) 
       // Dont retry, but fail miserably. Or return. Or something. 
       throw; 
     } 
    } 
} 

public void MyServiceCall(string stringArg, bool boolArg, int intArg) { 
    ExecuteServiceCall(() => MyWebService.MyServiceCall(stringArg, boolArg, intArg)); 
}