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

.NET Core控制台:简化配置/主机构建器与服务集合整合,统一注册Serilog与HttpClient

在.NET Core控制台程序中简化Serilog与HttpClient的注册方案

你当前的代码分别通过ConfigurationBuilder配置Serilog、ServiceCollection注册HttpClient,完全可以通过Host构建器统一完成两者的配置与注册,这也是.NET Core控制台程序的推荐实践,能大幅简化代码逻辑。

原代码

static void BuildConfig(IConfigurationBuilder builder)
{
    builder.SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
        .AddEnvironmentVariables();
}

var builder = new ConfigurationBuilder();
BuildConfig(builder);
Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(builder.Build()).Enrich.FromLogContext().WriteTo.Console().CreateLogger();
Log.Logger.Information("Application started");
var host = Host.CreateDefaultBuilder();
    //.ConfigureServices((context, services) => 
    //{ 
        
    //}).UseSerilog().Build();

var serviceProvider = new ServiceCollection().AddHttpClient()    
    .BuildServiceProvider(); //AddLogging(builder => { builder.AddSerilog(); });

var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
var client = httpClientFactory.CreateClient();

简化后的统一方案

利用Host.CreateDefaultBuilder()的默认配置能力,同时集成Serilog和HttpClient的注册,代码如下:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Serilog;

// 构建Host,统一处理配置、日志与服务注册
var host = Host.CreateDefaultBuilder()
    // 集成Serilog,直接读取Host的配置
    .UseSerilog((context, loggerConfig) =>
    {
        loggerConfig
            .ReadFrom.Configuration(context.Configuration)
            .Enrich.FromLogContext()
            .WriteTo.Console();
    })
    // 注册HttpClient到服务集合
    .ConfigureServices(services =>
    {
        services.AddHttpClient();
    })
    .Build();

// 输出启动日志
Log.Information("Application started");

// 从Host的服务容器获取HttpClientFactory
var httpClientFactory = host.Services.GetRequiredService<IHttpClientFactory>();
var client = httpClientFactory.CreateClient();

// 执行你的业务逻辑...

// 程序结束时优雅关闭Host
await host.RunAsync();

简化说明

  1. 自动加载配置:Host.CreateDefaultBuilder()默认已经实现了你BuildConfig方法的所有逻辑——加载当前目录的appsettings.json、对应环境的appsettings.{Environment}.json以及环境变量,无需手动重复编写。
  2. 统一日志配置:通过.UseSerilog()直接将Serilog集成到Host的日志体系中,不需要手动初始化Log.Logger,配置直接复用Host加载的配置源。
  3. 集中服务注册:所有服务(包括HttpClient)都在.ConfigureServices()中注册,无需单独创建ServiceCollection,由Host统一管理服务生命周期,符合.NET Core依赖注入的设计规范。

自定义配置扩展(可选)

如果需要添加额外的配置源(比如自定义配置文件),可以在Host构建器中扩展:

var host = Host.CreateDefaultBuilder()
    .ConfigureAppConfiguration((context, configBuilder) =>
    {
        // 添加自定义配置文件
        configBuilder.AddJsonFile("customsettings.json", optional: true, reloadOnChange: true);
    })
    .UseSerilog(...)
    .ConfigureServices(...)
    .Build();

内容的提问来源于stack exchange,提问作者Wes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:26:17