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

ASP.NET Core 6 Windows Worker Service服务构造失败求助

解决ASP.NET Core 6 Windows Worker Service中Serilog ILogger无法解析的问题

问题根源

  1. 错误在Host的配置流程中创建了WebApplicationBuilder,Worker Service基于Host而非Web应用,该多余构造导致Serilog配置未关联到主Host的服务容器。
  2. Serilog的ILogger未正确注册到主DI容器,导致HostedService(Worker、MyBackgoundTransactionConsumer)无法解析依赖。
  3. 依赖注入注册存在错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:27:44