0

我目前有一个用 C# 编写的类,它执行一些简单的错误日志记录。它在我的整个项目中被广泛使用。

class LogError
{
    //constructor
    public LogError() { }

    //public methods
    public void saveToTextFile() { }

    //other similar methods...
}

但是,这个类似乎不是一个好的设计,因为每次我必须创建一个LogError类的实例saveToTextFile()才能使用方法。

所以我正在考虑重新设计这个类。这是应用单例模式的好案例吗?不如让它成为静态类呢?有什么建议么?谢谢。

4

6 回答 6

1

Singleton 的问题是很难使用不同的日志记录行为。您想稍后介绍“发送电子邮件而不是写入文本文件”的图像。如果有的话基本上是一样的

new LogError().DoSomething();

或者

LogError.Instance.DoSomething();

除了 LogError 类本身的性能和/或实现。

如果你想增加灵活性,你最好使用依赖注入(另外,它使你的代码比单例更清晰)或依赖查找(介于两者之间)。

于 2013-03-01T05:53:55.397 回答
1

我会看看 Apache log4net。你不必担心任何事情。您可以将其配置为从您的配置文件(或在代码中)记录到多个目标。日志消息模板是完全可定制的。您可以过滤和路由不同的日志级别(调试/信息/警告/错误)。真的不值得在这里重新发明轮子。

于 2013-03-01T06:09:29.913 回答
0

是的,让它成为单例并且线程安全

于 2013-03-01T05:35:57.253 回答
0

如果您正在使用任何容器(Autofac、Unity 等),那么您可以使用该容器。

单例可以被打破(通过使用反射所以被告知)

其中一种实现是(这不需要显式锁定)

public class  MySingleton
{
    private static readonly MySingleton _singtonInstance =  new MySingleton();
    private MySingleton()
    {

    }

    public static MySingleton SingtonInstance
    {
        get { return _singtonInstance; }
    }
}
于 2013-03-01T05:52:04.827 回答
0

你可以使用接口作为你的日志系统外观,比如

interface ILoggerFacade{
    void Error(Exception e);
    void Warning(Exception e);
    ....
}

之后你需要进行接口实现

class SimpleLogger:ILoggerFacade{

    void Error(Exception e){//logging error};
    ...
}

最后,您需要输入指向您的记录器的点。我通常使用静态类,但单例也是变体。

静态类示例:

 class StaticLogger{

     private ILoggerFacade _logger;
     StaticLogger(){
        //choose ILoggerFacade implementation
        _logger=new SimpleLogger();
     }
     public static ILoggerFacade Logger{
        get{ return _logger;}
     }
 }

如果您将使用外观界面,您可以在需要时轻松更改项目中的记录器。

于 2013-03-01T06:19:56.823 回答
0

有一个解决方案,您有一个日志记录方法,一旦应用程序中的任何地方发生异常,就会调用该方法。您所需要的只是一个通用或通用的异常处理程序。就是这样。

在您的 Program.cs(在 Application.Run 之前的 Main() 方法中)添加此代码。

 Application.ThreadException += CommonExceptionHandler;

在您的 Program.cs 文件上创建 CommonExceptionHandler 事件,让我们在 Main 方法旁边说。

private static void CommonExceptionHandler(object sender, ThreadExceptionEventArgs t)
        {
           LogError(t.Exception);
        }

在 Program.cs 上创建 LogError 方法

 public static void LogError(Exception ex)
        {
            var errMsg = ex.Message;
            errMsg += ex.InnerException != null ? ex.InnerException.Message : string.Empty;
            //TODO: Do what you want if an error occurs
        }

这将捕获应用程序中发生的所有异常。您不再需要担心是否会为所有方法中的每个 catch 块调用错误日志类

于 2013-03-01T07:14:07.160 回答