【问题标题】:How is ILogger<T> resolved via DI?ILogger<T> 如何通过 DI 解决?
【发布时间】:2018-10-24 20:31:15
【问题描述】:

我看到各种库从 DI 解析 ILogger&lt;T&gt;。例如,请参阅 Identity 的 SignInManager 类。

ILogger&lt;T&gt; 在哪里注册到 DI 容器以使这成为可能?

我所能找到的只是一个在 Hosting 的 WebHostBuilder 类中注册的 ILoggerFactory 实例。允许从应用程序代码解析ILoggerFactory,但不允许解析ILogger&lt;T&gt; 是有意义的。

从日志记录examples,为了创建ILogger,您必须显式调用factory.CreateLogger()

【问题讨论】:

  • 我认为这可能是您正在寻找的代码 github.com/aspnet/Logging/blob/dev/src/… 就像,我可以澄清一下我们是否应该使用 ILoggerFactory 来创建记录器实例,或者我们应该声明我们需要一个 ILogger 在我们的构造函数中。
  • 似乎 Logger 本身在其自己的构造函数中采用 ILoggerFactory,因此它可以创建该类型的实际记录器。 github.com/aspnet/Logging/blob/dev/src/… 我想我会在我目前依赖 ILoggerFactory 并明确创建自己的记录器的地方在 myc 代码中尝试它。
  • 哇,我怎么没看到?那是我一直在寻找的缺失部分。
  • 我发现它工作得很好,而且声明对 ILogger 的依赖似乎更简单。我有一种情况,我直接创建了一些子对象,而不是使用 DI,在这种情况下,我仍然需要 ILoggerFactory,所以我可以将它传递给子对象,让他们创建自己的记录器。
  • 有道理。如果你想发布你的答案,我会接受。

标签: asp.net-core


【解决方案1】:

ILogger 在这里注册为 Logger: https://github.com/aspnet/Logging/blob/master/src/Microsoft.Extensions.Logging/LoggingServiceCollectionExtensions.cs

Logger 将 ILoggerFactory 带入它自己的构造函数中,因此它可以创建任何类型的实际记录器: https://github.com/aspnet/Logging/blob/master/src/Microsoft.Extensions.Logging.Abstractions/LoggerOfT.cs

因此,将构造函数依赖于 ILogger 似乎比将构造函数依赖于 ILoggerFactory 以手动创建记录器更简单。但是在某些情况下,如果您需要创建多种类型的记录器或新建其他也需要创建记录器的对象,则可能需要 ILoggerFactory。

【讨论】:

  • 答案中的链接断开
  • 我已经修复了链接
猜你喜欢
  • 2016-11-10
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
相关资源
最近更新 更多