我有一定的代码模式(每个函数的日志性能和其他变量)需要出现在每个函数中,我不想一遍又一遍地重复代码。这是代码的样子:
public OutClass FUNC-X
{
if (IsDebugEnabled)
{
Logger("Start DataLibrary: FUNC-X");
}
try
{
CheckInitSucceeded();
GetAuthenticationTokens();
var dm = new Manager();
/**
* THIS SINGLE LINE IS THE VARIABLE PART
**/
var output = dm.FUNC-X(...);
if (IsDebugEnabled)
{
var data = Serialize(output);
Logger(output);
}
return output;
}
catch (WebFaultException)
{
throw;
}
catch (OtherException ex)
{
if (Logger.IsErrorEnabled)
{
Logger.LogError("Exception in FUNC-X", ex);
}
throw new OtherException("Some Message");
}
catch (Exception ex)
{
if (IsErrorEnabled)
{
Logger("Exception in FUNC-X", ex);
}
throw new Exception("Generic Exception");
}
finally
{
if (IsDebugEnabled)
{
Logger("End FUNC-X");
}
}
}
基本上,我只需要用FUNC-Y或FUNC-Z替换FUNC-X到处出现这个名称,是否有某种设计模式可供我使用?
如果问题含糊不清,我很抱歉,我很乐意提供您提出的任何细节。
答案 0 :(得分:1)
您可以使用简单委托接受变量部分作为参数(如果单行中函数调用的参数没有相同)
public void Function_X(Func<object,..> func)
{
if (IsDebugEnabled)
{
Logger("Start DataLibrary: FUNC-X");
}
try
{
CheckInitSucceeded();
GetAuthenticationTokens();
var dm = new Manager();
/**
* THIS SINGLE LINE IS THE VARIABLE PART
**/
// var output = dm.FUNC-X(...);
var output = func(...);
if (IsDebugEnabled)
{
var data = Serialize(output);
Logger(output);
}
return output;
}
catch (WebFaultException)
{
throw;
}
catch (OtherException ex)
{
if (Logger.IsErrorEnabled)
{
Logger.LogError("Exception in FUNC-X", ex);
}
throw new OtherException("Some Message");
}
catch (Exception ex)
{
if (IsErrorEnabled)
{
Logger("Exception in FUNC-X", ex);
}
throw new Exception("Generic Exception");
}
finally
{
if (IsDebugEnabled)
{
Logger("End FUNC-X");
}
}
}
答案 1 :(得分:1)
是的,有很多方法可以提供漂亮的日志代码。
使用aspect-oriented programming。有PostSharp和Spring.NET。您可以使用log4net库。 config之后所有这些都支持编写方法名称。
您可以使用T4并在编译之前为所有func生成代码。
您可以编写一个接受Func<object> method
和string methodName
的全局日志记录方法。假设您将日志记录方法命名为LogAndExecute
。然后打电话给你必须写如:
LogAndExecute("func-x", () => dm.Func-X(/*your args*/))
如果你的func的不同返回类型出现问题,请使用generics
答案 2 :(得分:1)
您可以创建一个接受Func委托的公共函数:
static public TOutClass CommonFunc<TOutClass>(Func<Manager, TOutClass> func)
{
if (IsDebugEnabled)
{
Logger("Start DataLibrary: FUNC-X");
}
try
{
CheckInitSucceeded();
GetAuthenticationTokens();
var dm = new Manager();
TOutClass output = func(dm);
if (IsDebugEnabled)
{
var data = Serialize(output);
Logger(output);
}
return output;
}
catch
[...]
}
你会把你的职能写成:
public OutClass FUNC-X(...)
{
return CommonFunc(dm=>dm.FUNC-X(...));
}