我目前有一个用C#编写的类,它可以执行一些简单的错误记录。它在我的整个项目中被广泛使用。
class LogError
{
//constructor
public LogError() { }
//public methods
public void saveToTextFile() { }
//other similar methods...
}
但是,它似乎不是这个类的好设计,因为每次我必须在LogError
方法之前创建saveToTextFile()
类的实例。
所以我正在考虑重新设计这门课程。应用Singleton模式这是一个很好的案例吗?那么让它变成静态类呢?有什么建议?谢谢。
答案 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块调用错误日志类