类型为ILogger的后备字段,但类型为ILogger <t>的注入参数

时间:2019-03-04 05:44:44

标签: c# logging dependency-injection .net-core

.Net Core日志记录框架旨在与依赖项注入一起使用。例如,如果要将日志记录添加到名为MyClass的类中,则需要向该类的构造函数中添加一个ILogger<MyClass>参数:

private readonly ILogger _logger;

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

问题

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

为什么我们不使用类型ILogger<MyClass>的后备字段而不是ILogger?有什么区别吗?

3 个答案:

答案 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界面添加任何其他方法或属性,因此您可以自由选择自己喜欢的人。

您可以在下面查看每个的源代码和记录代码:

ILogger code

ILoggerOfT code

答案 2 :(得分:2)

ILogger<T>实现ILogger。因此,您可以将ILogger<T>分配给ILoggerILogger<T>的XML注释是:

  

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

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

如果您深入研究service.AddLogging()的代码,则会将ILoggerFactoryILogger<>添加到IServiceCollection中。 ILogger<T>有一个具体的实现Logger<T>Logger<T>注入了上面提到的ILoggerFactory,然后调用CreateLogger传入了类型T的显示名称。LoggerFactory然后检查了已创建的Logger的缓存在T上并从缓存中返回,如果不存在则添加它。

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