【发布时间】:2013-04-04 14:23:32
【问题描述】:
我有许多方法需要使用相同模式进行一些日志记录。有些方法需要返回一些值,有些则不需要。我创建了一个带有 Action 参数的方法,以避免复制粘贴所有逻辑。它看起来像这样:
private void Execute(Action action)
{
Logger.Start();
try
{
action();
}
catch(Exception exception)
{
Logger.WriteException();
throw;
}
finally
{
Logger.Finish();
}
}
现在我有一些类似的电话
public void DoSomething(string parameter)
{
Execute(() => GetProvider(parameter).DoSomething());
}
但我需要一些返回值的函数。最好的方法是什么? 我现在找到了两个:
1) 使用 Func 创建 Execute 方法的副本
private T Execute<T>(Func<T> action)
{
Logger.Start();
try
{
return action();
}
catch(Exception exception)
{
Logger.WriteException();
throw;
}
finally
{
Logger.Finish();
}
}
此方法有效,但也有一些复制粘贴。
2) 欺骗参数成为一个动作:
public Result DoSomething(string parameter)
{
Result result = null;
Execute(() => result = GetProvider(parameter).DoSomething());
return result;
}
这不需要复制粘贴,但看起来不太好。
有没有办法以某种方式加入 Action 和 Func 以避免这些方法中的任何一种,或者可能有另一种方法来实现相同的结果?
【问题讨论】:
-
我使用您的第二种方法。我找不到任何其他方式的好方法,所以我很想看看你的问题的任何答案!
-
你能把这个模式(Logger.Start、try/catch/finally、Logger.WriteException、Logger.Finish)放到你的
Logger类本身吗?那时,代码重复的数量通常相当少,足以将Func<T>包装为Action与闭包语义并不是真正必要的。我怀疑您希望日志记录的处理开销尽可能小。 (或者,谁在乎?过早的优化!)但我肯定会考虑将Execute重载放入Logger本身。编辑:我猜Logger不是线程安全的,但这不是问题,嗯?
标签: c# .net delegates action func