首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >环境语境

环境语境
EN

Code Review用户
提问于 2016-09-07 02:44:42
回答 1查看 2.4K关注 0票数 15

您认为这种方式在不传递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库代码:

代码语言:javascript
复制
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>被定义为:

代码语言:javascript
复制
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应用程序的同时注入所有依赖项。

EN

回答 1

Code Review用户

回答已采纳

发布于 2016-09-29 21:44:52

在您提供的示例代码中,您只是在某个上下文中设置记录器写入的位置。您可能考虑传递记录器对象的原因是,当您需要为设置记录器对象进行更复杂的配置时。

这取决于你想要什么。一方面,有一个静态记录器是很好的。您不必担心在代码中任何地方都包含一个记录器param。如果您决定稍后进行更改,以便使配置更加灵活,那么在有大量静态方法调用时,必须重构代码是一项巨大的成本。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/140694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档