Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用静态属性返回类实例隐藏NLog_C#_.net_Logging_Nlog - Fatal编程技术网

C# 使用静态属性返回类实例隐藏NLog

C# 使用静态属性返回类实例隐藏NLog,c#,.net,logging,nlog,C#,.net,Logging,Nlog,我试图从我的代码中摆脱NLog的直接依赖性。因此,如果将来我决定使用另一个日志库,它将是无痛的。 我所做的如下: internal class Logger { private NLog.Logger _NLogInstance; internal static Logger Instance { get { return new Logger(); } } public Log

我试图从我的代码中摆脱NLog的直接依赖性。因此,如果将来我决定使用另一个日志库,它将是无痛的。 我所做的如下:

 internal class Logger
{
    private NLog.Logger _NLogInstance;

    internal static Logger Instance
    {
        get
        {
            return new Logger();
        }
    }

    public Logger()
    {
        LogManager.ReconfigExistingLoggers();
        _NLogInstance = LogManager.GetCurrentClassLogger();
    }

    public void Trace(string message)
    {
        _NLogInstance.Trace(message);
    }

    public void Debug(string message)
    {
        _NLogInstance.Debug(message);
    }

    public void Info(string message)
    {
        _NLogInstance.Info(message);
    }

    public void Warn(string message)
    {
        _NLogInstance.Warn(message);
    }

    public void Error(Exception ex, string message)
    {
        _NLogInstance.Error(ex, message);
    }

    public void Fatal(Exception ex, string message)
    {
        _NLogInstance.Fatal(ex, message);
    }
}
如您所见,要使用我的记录器,只需这样做

Logger.Instance.Fatal(ex, ex.Message);

因此,NLog的真正实现在某种程度上对记录器的用户是隐藏的。如果明天我需要使用Log4net,我只需要更改Logger类中的实现


这样做是否存在任何潜在问题?因为我在任何地方都看不到有人这样做。还是有更好的办法?

我完全同意这些评论。您可能不需要切换到另一个日志库,如果您这样做,那是因为新的库非常聪明,并且以另一种方式工作,因此您无论如何都需要更改您的抽象


如果你坚持包装你。它是几乎所有主要日志框架之上的抽象。这样你就不需要自己写抽象了。

我完全同意这些评论。您可能不需要切换到另一个日志库,如果您这样做,那是因为新的库非常聪明,并且以另一种方式工作,因此您无论如何都需要更改您的抽象


如果你坚持包装你。它是几乎所有主要日志框架之上的抽象。这样,您就不需要自己编写抽象。

如果明天我需要使用Log4net,这是一个众所周知的反模式:您不需要它@奥斯卡介意再解释一下吗?我能看到的是,如果我不这样做,我会紧紧抓住NLog。所以呢?有什么问题吗?您是否认为更改日志提供程序的能力是您的软件真正需要的功能?你听说过有哪个项目更换了他们的日志提供商吗?我不知道。如果明天有一个新的日志库比NLog优越得多,并且能够做NLog不能做的事情,我们可能会想切换。将代码松散地结合起来不是很好吗?或者换言之。我可以把这种做法应用到其他类似的案例中吗?你不知道,但我会告诉你:它可能在99.9%的范围内永远不会发生。最好在实际实现中使用您的努力,而不是在这些琐碎的细节中,这些细节只会让您过度工程化,增加复杂性并降低性能。“如果明天我需要使用Log4net”,这是一个众所周知的反模式:您不需要它@奥斯卡介意再解释一下吗?我能看到的是,如果我不这样做,我会紧紧抓住NLog。所以呢?有什么问题吗?您是否认为更改日志提供程序的能力是您的软件真正需要的功能?你听说过有哪个项目更换了他们的日志提供商吗?我不知道。如果明天有一个新的日志库比NLog优越得多,并且能够做NLog不能做的事情,我们可能会想切换。将代码松散地结合起来不是很好吗?或者换言之。我可以把这种做法应用到其他类似的案例中吗?你不知道,但我会告诉你:它可能在99.9%的范围内永远不会发生。最好在实际实现中使用您的努力,而不是在这些琐碎的细节中,这些细节只会让您过度工程化,增加复杂性并降低性能。谢谢Thomas和Oscar。事实上,试图将记录器解耦是过度工程化的。此外,NLog建议每个类有一个记录器。这将破坏包装它的目的,即每个应用程序只有一个记录器。但是,忘了logger吧,我仍然有兴趣知道我问题中建议的实现是否有意义。我可以用它来做其他的事情吗。我将把这个标记为答案。Thanks@Terrence这是有道理的。如果您想记录其他内容,如性能指标等,那么类也可以包含这些内容。但我认为,当你违背这样的单一责任时,你会很快遇到问题。最好为不同的职责分别上课。谢谢托马斯和奥斯卡。事实上,试图将记录器解耦是过度工程化的。此外,NLog建议每个类有一个记录器。这将破坏包装它的目的,即每个应用程序只有一个记录器。但是,忘了logger吧,我仍然有兴趣知道我问题中建议的实现是否有意义。我可以用它来做其他的事情吗。我将把这个标记为答案。Thanks@Terrence这是有道理的。如果您想记录其他内容,如性能指标等,那么类也可以包含这些内容。但我认为,当你违背这样的单一责任时,你会很快遇到问题。最好为不同的职责设置单独的课程。