首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ILogger型的支持字段而ILogger<T>型的注入参数

ILogger型的支持字段而ILogger<T>型的注入参数
EN

Stack Overflow用户
提问于 2019-03-04 05:44:44
回答 3查看 166关注 0票数 0

.Net核心日志记录框架被设计为与依赖注入一起使用。例如,如果要向名为MyClass的类添加日志记录,则需要向类的构造函数添加ILogger<MyClass>参数:

代码语言:javascript
复制
private readonly ILogger _logger;

MyClass(ILogger<MyClass> logger)
{
    _logger = logger;
}

问题

上述编码模式(IMHO)非常常见,其中支持字段类型ILogger,而注入参数的类型ILogger<T>

为什么我们不使用ILogger<MyClass>类型的支持字段而不是ILogger呢?有什么不同吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-04 06:22:23

ILogger<T>实现了ILogger。这就是为什么您可以将ILogger<T>分配给ILoggerILogger<T>的XML注释是:

通常用于从依赖项注入激活命名的ILogger。

这告诉您,在某个地方,某些代码需要该类型为您创建一个记录器。

如果深入研究service.AddLogging()的代码,就会将ILoggerFactoryILogger<>添加到IServiceCollection中。ILogger<T>有一个具体的实现Logger<T>Logger<T>获得上述注入的ILoggerFactory,然后调用CreateLogger,传入T. LoggerFactory类型的displayname,然后根据T检查已经创建的Logger的缓存,并从缓存中返回,如果不存在,则添加缓存。

因此,基本上,它没有添加额外的功能,但在内部,它通过将每个类型的ILogger存储在缓存中并在需要时将其交给您来提高性能。之所以需要<T>,是因为它被用于字典/缓存查找

票数 3
EN

Stack Overflow用户

发布于 2019-03-04 06:12:44

ILogger<T>的定义如下:

代码语言:javascript
复制
public interface ILogger<out TCategoryName> : ILogger
{
}

我在Visual中通过“转到定义”找到了这段代码,但是您可以在现在存档的存储库这里中看到同样的代码。

在此基础上,我的结论是,ILogger<T>提供了一种简单的方法来设置生成的记录器的类别,但实际上并没有改变功能。因此,我认为使用ILogger作为支持字段是可以的,因为ILogger<T>没有添加任何方法。

票数 2
EN

Stack Overflow用户

发布于 2019-03-04 06:13:14

没有什么不同。ILogger<T>接口不向ILogger接口添加额外的方法或属性,因此您可以随意选择任何您喜欢的方法或属性。

您可以查看每个代码的源代码,以及下面的日志代码:

ILogger代码

ILoggerOfT代码

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54977274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档