我有一个包含数百个并发用户的Web服务,我有一个静态日志记录类来记录引发的错误。我需要在记录器中跟踪最初未被跟踪的UserID。
这听起来非常简单,因为我可以将UserID传递给Logger函数调用,但由于这是遗留系统,我不能更改调用参数。我可以在程序首次启动时添加一些代码,或者在记录器本身内添加一些代码,但是修改每个调用签名都是不可能的。
如何在记录器中获取userID而不在每次记录器调用中都传递给它?
这是我当前的功能以及我的问题所在:
public static class Log
{
public static void Error(object message, Exception ex)
{
log.Error(message, ex);
IDictionary customData = new Dictionary<string, string>() {{"message", message.ToString()}};
customData.Add("UserID",???????);
DoLogging(ex, customData);
}
}
以下是我无法使用的琐事解决方案:
public static class Log
{
public static void Error(object message, Exception ex, int userID)
{
log.Error(message, ex);
IDictionary customData = new Dictionary<string, string>() {{"message", message.ToString()}};
customData.Add("UserID", userID.ToString());
DoLogging(ex, customData);
}
}
一个可能的解决方案是在Logger类中保存某种类型的静态变量,但请记住,这个类是静态的,并且可能有数百个并发实例,如何判断哪个实例正在调用记录器?
public static class Log
{
private static concurrent DataStrucutre userIDs;
public static void Error(object message, Exception ex)
{
log.Error(message, ex);
IDictionary customData = new Dictionary<string, string>() {{"message", message.ToString()}};
customData.Add("UserID",userIDs[????]);
DoLogging(ex, customData);
}
}
答案 0 :(得分:2)
答案是你不能。
但你可以使参数可选。这样,您修改的代码将user_id
,其他代码不会中断。
How can you use optional parameters in C#?的答案讨论了如何在4.0版中执行此操作或在早期版本中(通过重载)。