0

私はサードパーティの API を使用しています。この API には、次のような、明確ではあるが類似した HTTP 関連のオブジェクトが多数あります。

TypeAService, TypeARequest, TypeAResponse

TypeBService, TypeBRequest, TypeBResponse

呼び出しのパターンは常に同じで、次のようになります。

myTypeXResponse = myTypeXService.SubmitRequest(myTypeXRequest);

この行を、バックオフして再試行することで特定のものを処理する基本的なコードと、その他のいくつかの詳細でラップする必要がありますTypeXServiceException。約 10 ~ 20 行のコードを何度も入力する必要があります。このコード行を関数でラップするエレガントな方法を探しています。この関数は、呼び出されるメソッドと予想される例外タイプを指定することで呼び出すことができます。次のようなものです。

myTypeXResponse = myWrapperFunction(myTypeXService.SubmitRequest, myTypeXRequest, typeof(TypeXServiceException));

関数がオブジェクトを取得して返すようにしましたが、関数を渡すには、ここではできない関数の署名について具体的に説明する必要があります。ジェネリックでこれを行う方法があるように感じますが、オンラインでの私の調査では、私の質問に完全に答えるものは何も得られませんでした.

どんな助けでも大歓迎です。

4

2 に答える 2

1

ジェネリックを使用してこれを処理できます。

public static T myWrapperFunction<T>(Func<T, T> func, T request)
    //where T : //some common base type, if it helps
{
    return func(request);
}
于 2013-08-21T14:39:31.463 に答える
0

Servy がこの問題に対して提案した方法 (私の最後のコメントの改訂) は、しばらくの間非常にうまく機能していましたが、最近、ジェネリックの代わりにデリゲートを使用して、別のアプローチで同様の問題を解決しました。他の誰かがコードの恩恵を受けることができる場合に備えて、ここに投稿します。

public delegate bool TryAgainAfterException(Exception ex);

public void RepeatAction(Action action, TryAgainAfterException tryAgainFunction)
{
   // set up whatever logic you would use for your do-while loop here
   bool tryAgain;

   do
   {
      tryAgain = false;
      try
      {
         action();
      }
      catch (Exception ex)
      {
         if (tryAgainFunction(ex))
         {
            // the specific logic of the Exception
            // handling would go here, including:
            tryAgain = true;
         }
         else
            throw ex;
      }
   }
   while (tryAgain);
}

これで、呼び出しをアクション内にラップすることで、応答オブジェクトを取得できます。

RepeatAction( () => { myTypeXResponse = myTypeXService.SubmitRequest(myTypeXRequest); },
              e => e.GetType() == TypeXServiceException );

どちらか一方の方法を推奨しているわけではありませんが、これも共有したいと思います。

于 2014-05-28T22:49:57.450 に答える