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

Blazor WASM:DI注入全局配置类值未更新问题求助

问题分析与解决方案

核心问题1:重复构建Host导致初始化失效

你的Program.cs中调用了两次builder.Build():

  • 第一次构建的host中,你获取了TestInject实例并调用了GetStuff()
  • 但第二次调用builder.Build().RunAsync()时,会创建一个全新的服务容器,里面的TestInject单例是未初始化的初始状态,之前的初始化操作完全无效。

核心问题2:GetStuff方法未更新当前实例

你的GetStuff方法新建了一个TestInject实例并赋值返回,但没有修改当前DI容器中已存在的单例实例的属性,导致注入到组件的实例还是初始值。


修正步骤

1. 修复Program.cs的重复Build问题

只构建一次Host,复用同一个实例完成初始化并运行:

var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.RootComponents.Add<HeadOutlet>("head::after");

builder.Services.AddScoped(sp => new HttpClient { 
    BaseAddress = new Uri(builder.Configuration["API_Prefix"] ?? builder.HostEnvironment.BaseAddress) 
});
builder.Services.AddSingleton<TestInject>();
builder.Services.AddOptions();

// 只构建一次Host
var host = builder.Build();
var settingsService = host.Services.GetRequiredService<TestInject>();
await settingsService.GetStuff();

// 使用同一个Host运行
await host.RunAsync();

2. 修复TestInject的GetStuff方法逻辑

不要新建实例,直接更新当前实例的属性,同时建议通过构造函数注入HttpClient(避免重复创建,复用DI配置的实例):

public class TestInject
{
    private readonly HttpClient _httpClient;

    public string TestItem { get; set; } = "Item A";

    // 构造函数注入HttpClient
    public TestInject(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }

    public async Task GetStuff() 
    {
        // 使用注入的HttpClient
        var client = new ContentfulClient(_httpClient, SiteConfig.CONTENTFULAPIKEY, SiteConfig.CONTENTFULPREVIEWAPIKEY, SiteConfig.CONTENTFULSPACEID);
        var queryBuilder = QueryBuilder<Globals>.New.ContentTypeIs("transitionConfig");
        var globalSettings = await client.GetEntries(queryBuilder);

        // 直接更新当前实例的属性,而非新建实例
        foreach(var item in globalSettings)
        {
            TestItem = item.phase1Title;
        }
    }
}

3. 组件中验证更新

在MainLayout.razor中,可以在生命周期方法中确保初始化完成后再读取:

@inject TestInject TestInject

@code {
    protected override void OnInitialized()
    {
        Console.WriteLine(TestInject.TestItem); // 现在会显示API获取到的值
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:02:31