.Net Core日志记录框架旨在与依赖项注入一起使用。例如,如果要将日志记录添加到名为MyClass
的类中,则需要向该类的构造函数中添加一个ILogger<MyClass>
参数:
private readonly ILogger _logger;
MyClass(ILogger<MyClass> logger)
{
_logger = logger;
}
上面的编码模式非常常见(IMHO),其中ILogger
类型的支持字段,而ILogger<T>
类型的注入参数。
为什么我们不使用类型ILogger<MyClass>
的后备字段而不是ILogger
?有什么区别吗?
答案 0 :(得分:2)
V_REZ
的定义如下:
GENERIC_API_PKG.DETAILS_ROW
我在Visual Studio中通过“转到定义”找到了这段代码,但是您可以在现在归档的存储库here中看到相同的代码。
在此基础上,我的结论是ILogger<T>
提供了一种简单的方法来设置生成的记录器的类别,但实际上并没有改变功能。因此,我认为使用public interface ILogger<out TCategoryName> : ILogger
{
}
作为后备字段很好,因为ILogger<T>
不会添加任何方法。
答案 1 :(得分:2)
没有区别。 ILogger<T>
界面没有为ILogger
界面添加任何其他方法或属性,因此您可以自由选择自己喜欢的人。
您可以在下面查看每个的源代码和记录代码:
答案 2 :(得分:2)
ILogger<T>
实现ILogger
。因此,您可以将ILogger<T>
分配给ILogger
,ILogger<T>
的XML注释是:
通常用于启用从依赖项注入激活命名的ILogger。
这告诉您在某个地方,某些代码需要使用类型来为您创建记录器。
如果您深入研究service.AddLogging()
的代码,则会将ILoggerFactory
和ILogger<>
添加到IServiceCollection
中。 ILogger<T>
有一个具体的实现Logger<T>
。 Logger<T>
注入了上面提到的ILoggerFactory
,然后调用CreateLogger
传入了类型T的显示名称。LoggerFactory
然后检查了已创建的Logger
的缓存在T
上并从缓存中返回,如果不存在则添加它。
因此,基本上,它没有添加任何其他功能,但在内部,它通过将每种类型的ILogger存储在缓存中并在需要时将其交给您来提高性能。之所以需要<T>
,是因为它在字典/缓存查找中得到了使用