Dotnet 核心中的 LoggerFactory 如何被调用

Posted

技术标签:

【中文标题】Dotnet 核心中的 LoggerFactory 如何被调用【英文标题】:How LoggerFactory in Dotnet core gets called 【发布时间】:2022-01-12 20:47:52 【问题描述】:

我在 Dotnet core 3.1 中创建了一个示例 ConsoleApp,并在其中添加了 Microsoft.Logging.Extension.Abstractions(5.0.0) 包。 我还使用了 Microsoft.Extensions.DependencyInjection(6.0.0) 并将 ServiceCollection 设置为:

var container = new ServiceCollection();
container.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
container.AddSingleton<ILoggerFactory>(new MyFactory()); // test implementation
// Created ServiceProvider
var sp = container.BuildServiceProvider();

然后我将记录器解析为sp.GetService&lt;ILogger&lt;TestClass&gt;&gt;(); 一旦我解决了记录器,它就会调用 LoggerFactory 的 CreateLogger 方法,其中 CategoryName 作为 className 并带有 Namespace 前缀...我的问题是它是如何在兜帽。看来GetService 正在调用 LoggerFactory 的方法。关于 DI 基础架构如何实例化和使用 LoggerFactory 有什么想法吗?

【问题讨论】:

它在第一次调用以获取服务并使用相同的实例之后被注册。您应该搜索 Singleton 依赖项是如何工作的。 我了解单例依赖关系我要问的是当 ILogger 被解析时,DI 如何知道使用 ILoggerFactory。 【参考方案1】:

Logger&lt;T&gt; 有一个依赖于ILoggerFactory 的公共构造函数。 LoggerFactory 就是这样解决的。

public class Logger<T> : ILogger<T>

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

这里是源代码的链接。

https://github.com/aspnet/Logging/blob/master/src/Microsoft.Extensions.Logging.Abstractions/LoggerOfT.cs

【讨论】:

以上是关于Dotnet 核心中的 LoggerFactory 如何被调用的主要内容,如果未能解决你的问题,请参考以下文章

dotnet 核心中的 Dbcontext 对象瞬态

将数据从视图传递到 dotnet 核心中的控制器

dotnet 核心包版本控制

dotnet 测试 - 覆盖 .net 核心配置的可能性

Rider 中的 dotnet:无法解析符号“Microsoft”

持续部署环境中的 dotnet 语义版本控制