您认为这种方式在不传递log对象的情况下可以在整个应用程序中使用日志记录吗?假设我们有一些东西可以让我们这样写东西:
类程序{静态空主(string[] args) {使用(新日志(“c:\a.txt”)) AsyncContext.Run(() => MainAsync());}静态异步任务MainAsync() { Log.Write("a1");//写入a.txt等待Task.Delay(1000);Log.Write("a2");//使用(新日志(“c:\b.txt”))写入c:\b.txt;等待F();Log.Write("a3");//写入a.txt }静态异步任务F() { Log.Write("b1");//写入b.txt }}
下面是Log库代码:
class Log : Ambient<Log>
{
public static void Write(string line) =>
Current?.WriteCore(line);
public Log(string fileName)
{
FileName = fileName;
}
void WriteCore(string line) => File.AppendAllText(FileName, line);
string FileName { get; }
}其中Ambient<T>被定义为:
class Ambient<T> : IDisposable where T : Ambient<T>
{
static readonly string Id = typeof(T).FullName;
protected static T Current
{
get { return (T)CallContext.LogicalGetData(Id); }
set { CallContext.LogicalSetData(Id, value); }
}
protected Ambient()
{
Previous = Current;
Current = (T)this;
}
public void Dispose() => Current = Previous;
T Previous { get; }
}理论上,Log的每个请求实例都可以来自IoC,在考虑到ASP.NET应用程序的同时注入所有依赖项。
发布于 2016-09-29 21:44:52
在您提供的示例代码中,您只是在某个上下文中设置记录器写入的位置。您可能考虑传递记录器对象的原因是,当您需要为设置记录器对象进行更复杂的配置时。
这取决于你想要什么。一方面,有一个静态记录器是很好的。您不必担心在代码中任何地方都包含一个记录器param。如果您决定稍后进行更改,以便使配置更加灵活,那么在有大量静态方法调用时,必须重构代码是一项巨大的成本。
https://codereview.stackexchange.com/questions/140694
复制相似问题