因此,我正在实现一个自定义.Net Core LoggerProvider,在某些示例中,我注意到该提供程序中对CreateLogger的每次调用都在(并发)字典中维护了对每个记录器的引用,因此代码如下: / p>
private readonly ConcurrentDictionary<string, ILogger> _loggers = new
ConcurrentDictionary<string, ILogger>();
public ILogger CreateLogger(string name)
{
if (_loggers.ContainsKey(name))
{
return _loggers[name];
}
var newLogger = new CustomLogger();
_loggers.GetOrAdd(name, newLogger);
return newLogger;
}
在每次请求时都返回相同实例是否有负面影响,实际上在应用程序的生命周期内将每个实例视为一个实例?
答案 0 :(得分:0)
此机制用于为每个记录器提供单独的categoryName
。如果您不使用类别名称,则不需要字典,您只需返回一个新的或单例记录器实例即可。
这实际上取决于您想要什么以及每个记录器的寿命。不过,通常情况下,您会按照类别(例如MyApp.SomeApiClient)实例化记录器,并在应用程序生命周期中多次记录日志(例如,每秒记录一次)。在这种情况下,与其每次都返回一个新的记录器,不如按类别保存记录器,这样可以节省您重新创建记录器的开销。
可以说,当您不经常重用记录器实例时,您现在会占用不必要的额外内存,但是我可以说所有这些方法通常是99.99%用例的最佳选择。当然,使用并发字典会产生开销。
因此,简而言之,您只需要实例来记住正确的类别名称,否则就可以不用它,但是可以节省一些对象分配/销毁。