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
相关产品推荐
相关产品推荐

