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
相关产品推荐
相关产品推荐

