ASP.NET Core 6 Windows Worker Service服务构造失败求助
解决ASP.NET Core 6 Windows Worker Service中Serilog ILogger无法解析的问题
问题根源
- 错误在Host的配置流程中创建了
WebApplicationBuilder,Worker Service基于Host而非Web应用,该多余构造导致Serilog配置未关联到主Host的服务容器。 - Serilog的
ILogger未正确注册到主DI容器,导致HostedService(Worker、MyBackgoundTransactionConsumer)无法解析依赖。 - 依赖注入注册存在错误:
services.AddSingleton<IMyTransactionRepository, IMyTransactionRepository>()中实现类写为接口,DI容器无法创建实例。
修复后的完整代码
using Serilog; IHost host = Host.CreateDefaultBuilder(args) .UseWindowsService() // 直接将Serilog配置绑定到主Host .UseSerilog((context, config) => { config .ReadFrom.Configuration(context.Configuration) .Enrich.FromLogContext() .WriteTo.Console(); }) .ConfigureServices(services => { // 注册后台服务 services.AddHostedService<Worker>(); services.AddHostedService<MyBackgoundTransactionConsumer>(); // 注册数据库上下文 services.AddSingleton<DataContext>(); // 修复仓储注册:第二个参数替换为具体实现类 services.AddSingleton<IMyTransactionRepository, MyTransactionRepository>(); services.AddSingleton<IQueueTransactionServices, QueueTransactionServices>(); services.AddSingleton<IHttpProxyClient, HttpProxyClient>(); }) .Build(); await host.RunAsync();
关键修复点说明
- 移除冗余的WebApplicationBuilder:Worker Service无需Web应用构建器,统一基于
Host配置即可,避免配置分散。 - Serilog与主Host绑定:通过
Host的.UseSerilog()扩展方法,自动将Serilog的ILogger注册到DI容器,确保后台服务能通过构造函数注入获取日志实例。 - 修正仓储注册:接口对应的实现类必须是具体类型(如
MyTransactionRepository),不能重复使用接口,否则DI容器无法实例化服务。 - 统一日志配置:通过
context.Configuration读取配置文件中的Serilog设置,同时保留控制台输出,确保日志正常输出。
验证
修复完成后,Worker和MyBackgoundTransactionConsumer的构造函数可直接注入ILogger<Worker>或ILogger<MyBackgoundTransactionConsumer>,DI容器会自动解析Serilog日志实例。
内容的提问来源于stack exchange,提问作者Bami
相关产品推荐
相关产品推荐

