我有一个c#网络服务。当我收到新请求时,我创建了一个日志记录实例。我有许多其他类的其他实例来处理请求,我也希望它们也能记录。共享日志记录实例而不在构造函数或属性中传递它的最佳方法是什么?
答案 0 :(得分:3)
通常使用某种静态类/属性来共享对象而无需在任何地方传递引用,例如:
public class Logger
{
static Logger()
{
this.Instance - new Logger();
}
public static Logger Instance
{
get;
private set;
}
// Other non-static members
}
用法:
Logger.Instance.Log();
这通常(或至少是对此的变化)称为singleton pattern。
上述内容有很多变化,例如以下细微变化在日志记录框架中比上述更常见:
public class Logger
{
static Logger()
{
this.Instance = new Logger();
}
public static Logger Instance
{
get;
private set;
}
public static void Log()
{
Logger.Instance.Log();
}
}
用法:
Logger.Log();
答案 1 :(得分:3)
Singleton Pattern is an anti-pattern;我无法想到应该使用或推荐的许多实例,包括在这种情况下,用于记录。
我们如何处理日志记录:通过构造函数注入将日志记录实例注入到需要它的所有类中。例如:
public class MyClass
{
private readonly ILogger _logger;
public MyClass(ILogger logger)
{
_logger = logger;
}
public void DoStuff()
{
_logger.Trace("DoStuff called");
}
}
注入的日志记录实例每次都可以是一个新实例,或者如果您只想使用单个实例记录器,则可以创建一次并根据需要传递。
但是:我强烈推荐第一个选项,使用DI来构建使用Composition Root模式的类。我还建议使用日志框架,例如NLog或log4net。这些是可配置的,易于使用电子邮件,事件查看器,文件等。和在多线程环境中工作。
我们有自己的ILogger定义,它有Trace,Warn,Info,Exception等,然后使用NLog实现这个接口。这意味着我们可以通过创建ILogger的新实现然后进行简单的DI配置更新来轻松更改我们的日志记录。这是迄今为止我们工作得非常好的一种记录解决方案。
答案 2 :(得分:2)
单身模式。
即具有私有构造函数的类。您使用公共静态方法仅创建该类的一个实例并返回该对象。
编辑:还值得注意的是,您需要将此类放在自己的项目中,以便所有类都可以引用它。
答案 3 :(得分:0)
好吧,你可以让你的日志记录类包含静态方法,它们实际写入内存/刷新到磁盘。您还可以查看Singleton Pattern
答案 4 :(得分:0)
您可以使用Singleton Pattern确保整个系统中只有一个日志记录对象实例。
将日志记录对象传递给构造函数或作为属性实际上会使代码更容易测试,具体取决于您实现Singleton模式的方式。记录是一个令人讨厌的横切问题之一,总是需要权衡利弊。
答案 5 :(得分:0)
通常,在每个类中创建记录器的新实例并不是问题。 Log4Net记录器构造函数将类型作为参数来为您提供更好的日志。
答案 6 :(得分:-1)
使用静态字段(我假设C#支持这些)。语法应类似于:
private static final Logger logger = new Logger(...);
只需在课堂上记录某些东西时使用它。