0

コードの量を減らすために、私たちのチームは StartProcess メソッドに入れ、単一のメソッドからのすべての呼び出しに対して WCF 実装を呼び出しました。それはすべてうまく機能しますが、ジェネリックメソッドからの実際の呼び出しは System.Action を使用して呼び出すため、値を返すことはできず、呼び出しの 1 つから要求/応答を行いたいので、できますその戻り値を取得します。

WCF 要求を処理する汎用メソッドを次に示します。

public static ProcessResultDC StartProcess<T>(T setupData, string processName, Action<T> action, string exteriorAccountNumber, string companyCode) where T : IAmValidatable, IHaveAProcessGuid {

    var result = new ProcessResultDC { Status = ProcessStatusEnum.Accepted };
    // Do some authentication stuff here

    try {

        action(setupData);    // <-- This returns void, but I would like to return a string to the client

    } catch (Exception exc) {
        result.Status = ProcessStatusEnum.Error;
        result.Messages.Add(exc.Message);
    }
    return result;
}

クライアントの呼び出しは次のとおりです。

var createOnDemandDataDc = new CreateOnDemandDataDc { RawData = punchRawData };
var result = TimeForceProcessHelper.StartProcess(createOnDemandDataDc, "Create On Demand Data", x => new CreateOnDemandDataProxy().CreateOnDemandData(createOnDemandDataDc), "NA", companyCode);

私の createOnDemandDataDc 実装は文字列を返しますが、結果変数はアクション呼び出しからの文字列を知る方法がありません。

これを行うより良い方法はありますか?または、戻り文字列を取得するために Action() 呼び出し以外のことをすることはできますか?

4

2 に答える 2

2

Action<T>コールバック パラメータに を使用する代わりに、 を使用して、コールバックFunc<T, TResult>が呼び出し元に値を返せるようにすることができますStartProcess。ただし、これには、すべてのコールバックを値を返す関数に変更する必要があります。応答を返す必要があるコールバックが 1 つしかない場合、おそらく良い考えではありません。

もう 1 つのやや汚いアプローチは、現在アクティブな OperationContext への応答を CreateOnDemandDataDc コールバック関数に直接書き込むことです。OperationContext.Current.RequestContext.Reply関連するプロパティ/メソッドを参照してください。

于 2013-03-27T18:55:35.623 に答える
1

これは私もAOPを行う方法です。側面ごとに 2 つのメソッドが必要ですActionFunc

最初のものを書く場合Func

public static ProcessResultDC StartProcess<T, TResult>(
  T setupData,
  string processName,
  Func<T, TResult> fn,
  string exteriorAccountNumber,
  string companyCode
)
  where T : IAmValidatable, IHaveAProcessGuid
{
  var result = new ProcessResultDC { Status = ProcessStatusEnum.Accepted };

  // Do some authentication stuff here

  try
  {
    result.Result = fn(setupData);
  }
  catch (Exception exc)
  {
    result.Status = ProcessStatusEnum.Error;
    result.Messages.Add(exc.Message);
  }

  return result;
}

次に、実装Actionを使用するためのものを書くことができます:Func

public static ProcessResultDC StartProcess<T>(
  T setupData,
  string processName,
  Action<T> fn,
  string exteriorAccountNumber,
  string companyCode
)
  where T : IAmValidatable, IHaveAProcessGuid
{
  return StartProcess(
    setupData,
    processName,
    t => { fn( t ); return 0; },
    exteriorAccountNumber,
    companyCode
  );
}
于 2013-03-27T19:06:47.623 に答える