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