You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#依赖注入场景下使用Logger的技术疑问咨询

多项目解决方案中Microsoft.Extensions.Logging的DI使用困惑

背景

我正在用C#开发一个包含多个项目的解决方案,其中有一个核心类库,多个UI/CLI项目均依赖于这个核心类库。

我的理解

ILoggerFactory用于实例化ILogger,因此将工厂传入依赖树是合理的实现方式。我的目标是让不同的UI项目能够配置不同的LoggerFactory设置与LoggingProvider,计划采用默认的Microsoft.Extensions.Logging实现。

现有问题代码

我在类库入口编写的代码存在明显问题,原本预期传入工厂参数并使用,但实际代码完全没有用到该参数:

//我希望将工厂作为输入参数传入
public Worker(ILoggingFactory factory)
{
    //这是我找到的创建应用构建器以传递依赖的方式
    var builder = Host.CreateApplicationBuilder();
    builder.Logging.ClearProviders();
    builder.Logging.AddConsole();
    builder.Logging.AddDebug();
    var host = builder.Build();
    host.Start();

    //这个ActivatorUtilities感觉很奇怪,但没找到更好的方法
    m_myObject = ActivatorUtilities.CreateInstance<ObjectType>(host.Services);
}

我尝试过几个修复思路,但都感觉不对:

  • 传入IServiceCollection,但无法通过DI自动实例化依赖树中的类,相比手动设置ILoggerFactory没有任何优势。
  • 传入builder作为参数。

我清楚自己遗漏了某些关键知识点,但无法确定具体内容。

补充疑问(编辑后)

阅读相关回答后,我理解了核心问题:不应在类库中使用DI容器,而是要在各个入口点(共3个不同位置)创建DI容器、配置不同的日志设置,再通过注入ILogger来创建Worker。但我仍有疑问:
如何创建Worker所需的、各自带有专属Logger的3个类?示例代码如下:

public Worker(ILogger<Worker> logger)
{
    var obj1 = new Class1(/*此处没有合适的Logger*/);
}

public Class1(ILogger<Class1> logger){...}

有人建议传入ILoggerFactory来实例化依赖树中的Logger,但这并非推荐做法。此外,我不清楚应该使用哪种DI容器,以及如何在Worker类中使用——毕竟使用ApplicationBuilder的初衷就是避免将工厂显式传递到每个依赖层级。还有说法建议传入ServiceCollection,这与传入工厂接口相比有什么优势?

内容的提问来源于stack exchange,提问作者Arkhain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:46:09