.NET 6控制台应用:读取配置获DbContext连接串及宿主构建疑问
.NET 6控制台应用:配置连接串与Host.Build()/Run()区别
一、从配置中获取数据库连接串
你可以通过ConfigureServices参数里的context.Configuration直接读取配置文件中的连接串,步骤如下:
- 在appsettings.json中配置连接串
确保你的项目根目录下的appsettings.json包含ConnectionStrings节点:
{ "ConnectionStrings": { "CompanyDb": "Server=.;Database=CompanyDB;Trusted_Connection=True;TrustServerCertificate=True;" } }
- 修改代码读取连接串
在ConfigureServices中,通过context.Configuration.GetConnectionString("CompanyDb")获取配置值,替换硬编码的占位符:
var hostBuilder = Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, builder) => { builder.SetBasePath(Directory.GetCurrentDirectory()); }) .ConfigureServices((context, services) => { // 从配置读取连接串 var connectionString = context.Configuration.GetConnectionString("CompanyDb"); services.AddDbContext<CompanyContext>(options => options.UseSqlServer(connectionString)); });
注:Host.CreateDefaultBuilder(args)已经默认加载了appsettings.json、环境变量等配置源,所以SetBasePath其实可以省略,除非你需要自定义配置文件路径。
二、hostBuilder.Build()与hostBuilder.Build().Run()的区别
- 仅调用
Build():
只会构建IHost实例,不会启动主机的生命周期。适合一次性任务场景(比如初始化数据库、执行单次业务逻辑),构建后你可以手动从主机获取服务,完成任务后记得调用Dispose()释放资源:
using var host = hostBuilder.Build(); // 获取服务执行任务 var dbContext = host.Services.GetRequiredService<CompanyContext>(); // 执行逻辑...
- 调用
Build().Run():
等价于先Build()构建主机,再调用RunAsync().GetAwaiter().GetResult(),会启动主机并阻塞当前线程直到主机关闭。适合长期运行的控制台应用(比如包含IHostedService后台服务的场景),它会触发主机的启动流程,包括调用所有IHostedService的StartAsync方法,直到收到停止信号(比如Ctrl+C)才会退出。
内容的提问来源于stack exchange,提问作者Tech with Thiru
相关产品推荐
相关产品推荐

