【发布时间】:2015-06-10 16:24:42
【问题描述】:
我的具体需求是存储远程 IP,以便在记录时打印它,而无需在每个方法调用中显式传递它。一种每个线程的环境变量范围。
我想有一个每个线程的单例,以便记录器可以访问它。有没有更好/更安全的方法?
让它与异步一起工作是一个加号。
我理想的 API 应该是这样的:
using (new LogScope("key1", "value1"))
{
Call1();
}
using (new LogScope("key1", "value1"))
{
Call1();
}
void Call1()
{
using (new LogScope("key2", "value2"))
{
Call2(); // key1:value1 key2:value2
using (new LogScope("key1", "value3"))
{
Call2(); // key1:value3 key2:value2
}
}
using (new LogScope("key1", "value3"))
{
Call2(); // key1:value3
}
}
void Call2()
{
foreach (var kv in LogScope.Context) Console.Write("'{0}':'{1}' ");
Console.WriteLine();
}
【问题讨论】:
-
您希望在
foreach循环中看到什么?仅内部LogScope的值(仅限key2),或两者的组合LogScopes(key1+key2)。如果结合起来,LogScope实例的目的是什么。当您退出using块时会处理什么? -
澄清了我的问题。
-
感谢您的澄清。我想我明白了你的意图,但仍有一种情况没有完全涵盖:当你退出
using块时。您是否希望键/值恢复到进入范围之前的状态?我认为是的,但我想确定一下。而且您的示例并没有完全涵盖这种情况。 -
是的。我希望范围仅在范围内覆盖。
-
那你可以看看我的回答。它应该完全按照您的描述工作。
标签: c# thread-local