使用Singleton模式进行错误记录类?

时间:2013-03-01 05:32:14

标签: c# .net design-patterns

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

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

    //public methods
    public void saveToTextFile() { }

    //other similar methods...
}

但是,它似乎不是这个类的好设计,因为每次我必须在LogError方法之前创建saveToTextFile()类的实例。

所以我正在考虑重新设计这门课程。应用Singleton模式这是一个很好的案例吗?那么让它变成静态类呢?有什么建议?谢谢。

6 个答案:

答案 0 :(得分:1)

Singleton的问题在于难以使用不同的日志记录行为。您希望稍后介绍“发送电子邮件而不是写入文本文件”的图像。如果你有

,它基本相同
new LogError().DoSomething();

LogError.Instance.DoSomething();

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

如果你想增加灵活性,你最好使用Dependency Injection(这使得你的代码比使用Singleton更清晰)或依赖查找(介于两者之间)。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

是的,使它成为单身,也是线程安全的

答案 3 :(得分:0)

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

单身人士可以被打破(通过使用反射,因此被告知)

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

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

    }

    public static MySingleton SingtonInstance
    {
        get { return _singtonInstance; }
    }
}

答案 4 :(得分:0)

您可以使用interface作为日志系统外观,例如

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;}
     }
 }

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

答案 5 :(得分: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块调用错误日志类