WinForms中Blazor Hybrid如何访问appsettings配置
WinForms Blazor 依赖注入与配置读取问题
我正在开发WinForms承载的Blazor应用,WinForms仅作为Blazor功能的载体。目前Blazor的DI配置是在窗体构造函数中完成的(参考Dan Roth的示例应用):
public partial class Form1 : Form { public Form1() { InitializeComponent(); var services = new ServiceCollection(); services.AddWindowsFormsBlazorWebView(); services.AddSingleton<WeatherForecastService>(); blazorWebView1.HostPage = "wwwroot\\index.html"; blazorWebView1.Services = services.BuildServiceProvider(); blazorWebView1.RootComponents.Add<Main>("#app"); } }
但部分服务需要从appsettings.json读取配置,我通常在普通项目的Program.cs中这样处理配置加载:
var builder = CreateHostBuilder() .ConfigureAppConfiguration((context, builder) => { builder.AddJsonFile("appsettings.json"); builder.AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json"); }); var host = builder.Build();
连接字符串也存储在appsettings中,现在需要实现类似这样的DI注册:
services.AddSingleton<ISheetToolConfig>( builder.Configuration.GetSection("SheetToolConfig").Get<SheetToolConfig>() ?? throw new NullReferenceException("SheetToolConfig"));
需要解决的核心问题是:如何在窗体的Blazor DI配置流程中访问appsettings.json的配置项?
解决方案一:在Program.cs中构建配置并传递给窗体
1. 在Program.cs中完成配置加载
[STAThread] static void Main() { Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // 构建配置对象,支持环境差异化配置 var configBuilder = new ConfigurationBuilder() .SetBasePath(AppContext.BaseDirectory) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true); IConfiguration configuration = configBuilder.Build(); // 将配置注入窗体 Application.Run(new Form1(configuration)); }
2. 修改窗体构造函数接收配置并用于DI注册
public partial class Form1 : Form { private readonly IConfiguration _configuration; public Form1(IConfiguration configuration) { _configuration = configuration; InitializeComponent(); var services = new ServiceCollection(); services.AddWindowsFormsBlazorWebView(); // 注册从配置读取的实例 services.AddSingleton<ISheetToolConfig>( _configuration.GetSection("SheetToolConfig").Get<SheetToolConfig>() ?? throw new NullReferenceException("未在appsettings中找到SheetToolConfig配置节")); // 示例:使用连接字符串注册DbContext services.AddDbContext<MyDbContext>(options => options.UseSqlServer(_configuration.GetConnectionString("DefaultConnection"))); services.AddSingleton<WeatherForecastService>(); blazorWebView1.HostPage = "wwwroot\\index.html"; blazorWebView1.Services = services.BuildServiceProvider(); blazorWebView1.RootComponents.Add<Main>("#app"); } }
解决方案二:直接在窗体构造函数中构建配置
如果不想在Program.cs中处理配置,也可以直接在窗体内部完成配置加载:
public partial class Form1 : Form { public Form1() { InitializeComponent(); // 构建配置 var configBuilder = new ConfigurationBuilder() .SetBasePath(AppContext.BaseDirectory) .AddJsonFile("appsettings.json", optional: false) .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true); IConfiguration configuration = configBuilder.Build(); var services = new ServiceCollection(); services.AddWindowsFormsBlazorWebView(); // 使用配置注册服务 services.AddSingleton<ISheetToolConfig>( configuration.GetSection("SheetToolConfig").Get<SheetToolConfig>() ?? throw new NullReferenceException("SheetToolConfig")); services.AddSingleton<WeatherForecastService>(); blazorWebView1.HostPage = "wwwroot\\index.html"; blazorWebView1.Services = services.BuildServiceProvider(); blazorWebView1.RootComponents.Add<Main>("#app"); } }
关键注意事项
- 确保
appsettings.json文件的属性设置为复制到输出目录(如果较新则复制),否则运行时会找不到配置文件。 - 环境变量
ASPNETCORE_ENVIRONMENT可以手动设置(比如通过项目属性的调试选项),用来切换不同环境的配置文件。
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

