私は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));
}
と同様に、戻り値を持つメソッドのための他のバージョンを使用する
ありがとうございます。ここではC#2になっていますので、lambdaの代わりに匿名のメソッドを使用する必要がありますが、それが役に立ちます。 – Charlie
十分に公正 - 理論は同じです; –