目前我的代码看起来像这样
Status("Start Step 1");
result = Step1();
Status("End Step 1", result);
Status("Start Step 2");
result = Step2();
Status("End Step 2", result);
Status("Start Step 3");
result = Step3();
Status("End Step 3", result);
是否有可能以某种方式重构此代码并摆脱状态行。 - 但是,在每个步骤的开始和结束时更新状态非常重要。
我考虑过将状态行移动到Step1,2,3调用中,但这会使方法变得混乱。
答案 0 :(得分:5)
public void ExecuteAndLog(Func<T> func, string startMessage, string endMessage) {
Status(startMessage);
var result = func;
Status(endMessage, result);
}
带有明显的调用
您可以根据需要进行优化。例如,建立在前一个:
public void ExecuteAndLog(Func<T> func, string message) {
ExecuteAndLog(func, "Start " + message, "End " + message);
}
使调用稍微简单甚至
public void ExecuteAndLog(Func<T> func, int stepNumber) {
ExecuteAndLog(func, String.Format("Step {0}", stepNumber));
}
建立在前一个。所以现在你可以说
ExecuteAndLog(Step1, 1);
ExecuteAndLog(Step2, 2);
ExecuteAndLog(Step3, 3);
答案 1 :(得分:1)
略微改善@Jason
public object ExecuteAndLog(Func<T> func, int number) {
Status(string.Format("Start Step {0}", number));
var result = func;
Status(string.Format("End Step {0}", number), result);
return result;
}
// and used like:
var result = ExecuteAndLog(Step1, 1);
result = ExecuteAndLog(Step2, 2);
result = ExecuteAndLog(Step3, 3);
答案 2 :(得分:1)
也许是这样的:
public void RunStep<T>(string stepName, Func<T> stepFunc)
{
Status("Start Step " + stepName);
var result = stepFunc();
Status("End Step " + stepName, result);
}
将被称为:
RunStep("1", Step1);
RunStep("2", Step2);
RunStep("3", Step3);
答案 3 :(得分:0)
如果他们都返回相同的结果类型,你可以像
那样 Runner(Step1, Step2, Step3);
public void Runner<T>(params Func<T>[] stepList)
{
foreach (var act in stepList)
{
Status(act.Method.Name + "Started");
var result=act.Invoke();
Status(act.Method.Name + "Ended", result);
}
}
答案 4 :(得分:0)
您可以使用Spring.Net记录器来避免一次又一次地调用Status。
感谢。