容器如何实际解决ILogger <t>

时间:2018-02-07 20:45:14

标签: c# asp.net-core

在ASP.NET Core 2中,当我们谈论日志记录时,仅通过ILoggerFactory.AddProvider()注册提供者或使用适当的扩展方法就足够了。然后,您就可以解析ILogger<T>(未注册已关闭的ILogger<>)。我在ILoggerFactory.CreateLogger<T>调用和实际ILogger<T>分辨率之间的桥梁上挣扎:似乎某处魔法发生了,但我找不到位置。 有任何想法吗?

1 个答案:

答案 0 :(得分:6)

一切都始于ConfigureLogging

public static IWebHostBuilder ConfigureLogging(
    this IWebHostBuilder hostBuilder,
    Action<ILoggingBuilder> configureLogging)
{
    return hostBuilder.ConfigureServices(
        collection => collection.AddLogging(configureLogging));
}

这里的重要性呼吁是AddLogging。我不会在这里包含整个函数,但注册过程如下所示:

services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>());
services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(Logger<>)));

如上所示,the ASP.NET Core Dependency Injection container allows for the registration of open generics

最后,Logger<T>的{​​{3}}如下所示:

public Logger(ILoggerFactory factory)
{
    // ...

    _logger = factory.CreateLogger(TypeNameHelper.GetTypeDisplayName(typeof(T)));
}

Logger<T>类的其余部分只是非通用_logger的直通,现在包含T类型的名称。