0

我有一个当前使用 NLog 进行日志记录的类库。我想更新这个库以使用来自Microsoft.Extensions.Logging.AbstractionsILogger<T>的抽象,以便这个库的使用者可以选择他们自己的日志框架。

该库使用带有私有构造函数和Instance属性的单例模式:

public static MyLibrary Instance { get; } = new MyLibrary();

private MyLibrary()
{
...
}

有什么建议可以让这个库保持单例,但允许消费者ILogger在启动/对象创建时提供实现?有没有办法让这个库在不改变单例模式的情况下接受来自其他应用程序的日志记录实现?

4

1 回答 1

2

您可以为记录器添加一个全局属性,大概类似于

public static ILoggerFactory LoggerFactory {get;set;} = NullLoggerFactory.Instance;

全局状态的所有潜在问题都适用,即使大多数日志框架可能是线程安全的。

一个明显的缺点是,除非消费者实际设置了 loggerFactory,否则不会发生日志记录。您还需要考虑初始化顺序。最明显的解决方案是停止使用单例,而是使用采用 loggerFactory 的工厂方法。IE

public static MyLibrary CreateMyLibrary(ILoggerFactory factory)

如果消费者想要将创建的库放在全局字段中,他可以自由地这样做。

于 2021-02-09T16:08:18.887 回答