1

私は、WCF インターフェイス プロキシに似たクラスを作成していますが、そのクラスには特殊ではあるがボイラープレートの余分なコードが含まれています。ボイラープレート コードを抽出し、ジェネリックまたはその他のメカニズムを使用して、クラスの内部インスタンスへの呼び出しをラップしたいと考えています。

public interface IMyInterface
{
  long fn1(int param1, int param2);
}

public class MyInterfaceProxy : IMyInterface
{
  // generated code
}

public class MyClass : IMyInterface
{
  private MyInterfaceProxy _myProxy; // implements IMyInterface
  public long fn1(int param1, int param2)
  {
    long result = null;
    CallMethod(
               delegate(IMyInterface svc)
               {
                   result = svc.fn1(param1, param2);
               });
    return result;
  }

  private T CallMethod( ??? )
     where T : class
  {
    T result = null;

    // some boilerplate code
    // Call the delegate, passing _myProxy as the IMyInterface to act on
    // some more boilerplate code

    return result;
  }

}

それが役立つ場合、定型コードは再試行ロジック、タイムアウト動作、標準化された例外処理動作などを表すことができます。

だからここに私の質問があります:

  1. この問題を解決するための標準的な方法または推奨される方法はありますか?
  2. ジェネリックが好ましいメカニズムである場合、CallMethod 関数のシグネチャは何ですか?
4

1 に答える 1

2

これがあなたが探しているものだと思います。関数を構成することでできることは他にもたくさんあります。これは、関数型プログラミング パラダイムのごく表面的なスクラッチであり、その一部を現在 c# で使用できることは本当に素晴らしいことです。

EDIT:デリゲートシナリオをより適切にシミュレートするために、匿名関数の実装も追加しました。

class Program
{
    static void Main(string[] args)
    {
        string resFromFunctionToBeWRapped = CallMethod(() => FunctionToBeWrapped());

        int resFromAnon = CallMethod(() => {
            Console.WriteLine("in anonymous function");
            return 5;
        } );

        Console.WriteLine("value is {0}", resFromFunctionToBeWRapped);
        Console.WriteLine("value from anon is {0}", resFromAnon);

        Console.ReadLine();
    }

    private static TResult CallMethod<TResult>(Func<TResult> functionToCall) //where T : class
      {
        Console.WriteLine ("in wrapper");

        var ret = functionToCall();

        Console.WriteLine("leaving wrapper");

        return ret;
      }

    private static string FunctionToBeWrapped()
    {
        Console.WriteLine("in func");
        return "done";
    }

}
于 2013-03-01T02:25:12.113 に答える