0

为了减少代码量,我们的团队在 StartProcess 方法中放置了一个方法,以便为来自单个方法的所有调用调用 WCF 实现。这一切都很好,但由于来自通用方法的实际调用使用 System.Action 来调用,它永远不能返回值,并且由于我正在进行的调用之一我想发出请求/回复,我可以' t 得到那个返回值。

这是处理 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。但是,这将要求您的所有回调都需要更改为返回值的函数。如果您只有一个需要返回回复的回调,则可能不是一个愉快的想法。

另一种有点脏的方法可能是直接在 CreateOnDemandDataDc 回调函数中写入对当前活动 OperationContext 的响应。查看OperationContext.Current.RequestContext.Reply和相关的属性/方法。

于 2013-03-27T18:55:35.623 回答
1

这也是我做AOP的方式。每个方面都需要两种方法 - 一种用于 an Action,一种用于 aFunc

如果你先写一个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 回答