.Net核心日志记录框架被设计为与依赖注入一起使用。例如,如果要向名为MyClass的类添加日志记录,则需要向类的构造函数添加ILogger<MyClass>参数:
private readonly ILogger _logger;
MyClass(ILogger<MyClass> logger)
{
_logger = logger;
}问题
上述编码模式(IMHO)非常常见,其中支持字段类型ILogger,而注入参数的类型ILogger<T>。
为什么我们不使用ILogger<MyClass>类型的支持字段而不是ILogger呢?有什么不同吗?
发布于 2019-03-04 06:22:23
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类型的displayname,然后根据T检查已经创建的Logger的缓存,并从缓存中返回,如果不存在,则添加缓存。
因此,基本上,它没有添加额外的功能,但在内部,它通过将每个类型的ILogger存储在缓存中并在需要时将其交给您来提高性能。之所以需要<T>,是因为它被用于字典/缓存查找
发布于 2019-03-04 06:12:44
ILogger<T>的定义如下:
public interface ILogger<out TCategoryName> : ILogger
{
}我在Visual中通过“转到定义”找到了这段代码,但是您可以在现在存档的存储库这里中看到同样的代码。
在此基础上,我的结论是,ILogger<T>提供了一种简单的方法来设置生成的记录器的类别,但实际上并没有改变功能。因此,我认为使用ILogger作为支持字段是可以的,因为ILogger<T>没有添加任何方法。
发布于 2019-03-04 06:13:14
没有什么不同。ILogger<T>接口不向ILogger接口添加额外的方法或属性,因此您可以随意选择任何您喜欢的方法或属性。
您可以查看每个代码的源代码,以及下面的日志代码:
https://stackoverflow.com/questions/54977274
复制相似问题