【问题标题】:How container actually resolve ILogger<T>容器如何实际解析 ILogger<T>
【发布时间】:2018-02-08 06:04:20
【问题描述】:

在 ASP.NET Core 2 中,当我们谈论日志时,只需通过 ILoggerFactory.AddProvider() 注册提供程序或使用适当的扩展方法就足够了。然后您将能够解析ILogger&lt;T&gt;(无需注册已关闭的ILogger&lt;&gt;)。我正在努力在ILoggerFactory.CreateLogger&lt;T&gt; 调用和实际ILogger&lt;T&gt; 分辨率之间架起一座桥梁:似乎某处发生了魔法,但我没有找到在哪里。 有任何想法吗?

【问题讨论】:

  • 这似乎是XY problem。您要达到的最终目标是什么?
  • '试图了解 ILogger 在没有直接接口注册的情况下如何解析。而已。还没有问题:)
  • 您是否要在库中查找容器中发生单个 ILogger 注册的位置?
  • @EugeneKomisarenko:是的

标签: c# asp.net-core


【解决方案1】:

一切都始于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&lt;T&gt;constructor 看起来像这样:

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

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

Logger&lt;T&gt; 类的其余部分只是对非泛型_logger 的传递,现在包括T 类型的名称。

【讨论】:

    猜你喜欢
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 2019-03-26
    • 2012-04-22
    • 1970-01-01
    • 2017-05-05
    相关资源
    最近更新 更多