控制台应用依赖注入中如何获取Serilog作为Microsoft Logger?(返回Null)
控制台应用中Serilog注入到自定义类的正确实现
问题根源分析
你遇到的ILogger返回null以及依赖注入失效的问题,主要来自三个错误:
- 非泛型
ILogger未被DI容器注册,默认只注册泛型ILogger<T>或ILoggerFactory - 手动实例化
MyService绕过了DI容器,无法自动注入依赖 - 冗余的
BuildServiceProvider()调用创建了未完全配置的独立容器,与最终Host的容器不一致
修正后的完整代码
Program.cs
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using MyProgram.Services; using Serilog; var hostBuilder = Host.CreateApplicationBuilder(args); // 加载配置(无需手动Build,Host会自动处理) hostBuilder.Configuration .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); // 配置并注入Serilog var logger = new LoggerConfiguration() .ReadFrom.Configuration(hostBuilder.Configuration) .Enrich.FromLogContext() .CreateLogger(); hostBuilder.Logging.ClearProviders(); hostBuilder.Logging.AddSerilog(logger); // 将自定义服务注册到DI容器 hostBuilder.Services.AddScoped<IMyService, MyService>(); // 构建Host var host = hostBuilder.Build(); // 从DI容器获取服务(替代手动实例化) var myService = host.Services.GetRequiredService<IMyService>(); // 调用服务方法 // myService.DoSomething(); // 保持控制台应用运行(按需使用) await host.RunAsync();
MyService.cs
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; public class MyService : IMyService { private readonly IConfiguration _config; private readonly ILogger<MyService> _logger; // 注入泛型ILogger<T>,DI容器会自动注册该类型 public MyService(IConfiguration config, ILogger<MyService> logger) { _config = config; _logger = logger; } public void DoSomething() { _logger.LogError("Exception occurred."); } } public interface IMyService { void DoSomething(); }
关键修正点说明
- 使用泛型日志器:替换非泛型
ILogger为ILogger<MyService>,DI容器会自动为每个服务类型注册对应的泛型日志实例 - 依赖注入容器管理服务:通过
AddScoped/AddSingleton/AddTransient注册服务,再通过GetRequiredService从容器获取,确保依赖自动注入 - 移除冗余代码:删除手动调用的
BuildServiceProvider()和配置的Build(),让Host统一管理容器和配置生命周期
内容的提问来源于stack exchange,提问作者TsugaVokkutto
相关产品推荐
相关产品推荐

