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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:03:22