.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();
简化说明
- 自动加载配置:
Host.CreateDefaultBuilder()默认已经实现了你BuildConfig方法的所有逻辑——加载当前目录的appsettings.json、对应环境的appsettings.{Environment}.json以及环境变量,无需手动重复编写。 - 统一日志配置:通过
.UseSerilog()直接将Serilog集成到Host的日志体系中,不需要手动初始化Log.Logger,配置直接复用Host加载的配置源。 - 集中服务注册:所有服务(包括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
相关产品推荐
相关产品推荐

