手动实例化类时如何搭配类型化ILogger使用微软日志扩展?
解决方案
方案1:遵循DI规范,避免手动实例化(推荐)
这是最符合ASP.NET Core DI设计原则的做法,不需要手动传递任何日志参数:
- 第一步:在Program.cs(或Startup.cs)里把
MyWorker注册到DI容器:
// .NET 6+ 顶层语句写法 builder.Services.AddTransient<MyWorker>();
- 第二步:直接在控制器构造函数注入
MyWorker,容器会自动为MyWorker注入匹配的ILogger<MyWorker>实例:
public class MyController: ControllerBase { private readonly ILogger<MyController> _logger; private readonly MyWorker _worker; public MyController(ILogger<MyController> logger, MyWorker worker) { _logger = logger; _worker = worker; } public bool DoWork() { _worker.DoSomething(); // 直接用注入好的实例即可 } }
备注:除非有不可替代的动态实例化需求,否则优先选择该方案,DI容器会自动处理所有依赖链的注入逻辑,后续MyWorker新增依赖时不需要修改调用侧代码
方案2:确实需要手动new的场景
如果你有特殊逻辑必须在方法内动态创建MyWorker实例,有两种可选传参方式:
方式A:直接注入ILogger<MyWorker>到控制器
在控制器构造函数加对应类型的Logger参数,new的时候直接传即可:
public class MyController: ControllerBase { private readonly ILogger<MyController> _logger; private readonly ILogger<MyWorker> _workerLogger; public MyController(ILogger<MyController> logger, ILogger<MyWorker> workerLogger) { _logger = logger; _workerLogger = workerLogger; } public bool DoWork() { MyWorker w = new MyWorker(_workerLogger); w.DoSomething(); } }
方式B:注入ILoggerFactory动态创建Logger
如果你的MyWorker是动态生成类型、或者需要批量创建多个不同类的Logger,可以用工厂生成:
public class MyController: ControllerBase { private readonly ILogger<MyController> _logger; private readonly ILoggerFactory _loggerFactory; public MyController(ILogger<MyController> logger, ILoggerFactory loggerFactory) { _logger = logger; _loggerFactory = loggerFactory; } public bool DoWork() { var workerLogger = _loggerFactory.CreateLogger<MyWorker>(); MyWorker w = new MyWorker(workerLogger); w.DoSomething(); } }
内容的提问来源于stack exchange,提问作者bpeikes
相关产品推荐
相关产品推荐

