Blazor WASM启动时如何将API返回值设为Singleton单例值?
Blazor 启动时初始化Singleton服务并获取API数据的解决方案
你可以通过在应用启动阶段主动初始化Singleton服务的方式实现需求,核心思路是让服务提供异步初始化方法,然后在Program.cs中完成启动时的API调用和数据赋值,避免依赖服务的懒加载逻辑。以下是具体步骤:
1. 改造Singleton服务,添加异步初始化逻辑
创建(或修改)你的Singleton服务类,注入HttpClient用于API调用,并暴露存储目标字符串的属性和初始化方法:
public class AppGlobalSettings { private readonly HttpClient _httpClient; // 存储从API获取的全局字符串 public string GlobalApiValue { get; private set; } = string.Empty; public AppGlobalSettings(HttpClient httpClient) { _httpClient = httpClient; } // 异步初始化方法:调用API并赋值 public async Task InitializeAsync() { try { // 替换为你的API地址和响应模型 var apiResponse = await _httpClient.GetFromJsonAsync<ApiResult>("api/global/setting-value"); GlobalApiValue = apiResponse?.Value ?? "default-value"; } catch (Exception) { // 处理API调用失败的情况,比如设置默认值或记录日志 GlobalApiValue = "fallback-value"; } } // 对应API返回的响应模型,根据实际接口调整 private class ApiResult { public string Value { get; set; } } }
2. 在Program.cs中注册服务并完成启动初始化
根据你使用的Blazor类型(WebAssembly/Server),在启动流程中主动调用初始化方法:
Blazor WebAssembly
var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.RootComponents.Add<App>("#app"); // 注册HttpClient和Singleton服务 builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); builder.Services.AddSingleton<AppGlobalSettings>(); // 构建宿主并初始化服务 var host = builder.Build(); var globalSettings = host.Services.GetRequiredService<AppGlobalSettings>(); await globalSettings.InitializeAsync(); await host.RunAsync();
Blazor Server
var builder = WebApplication.CreateBuilder(args); builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor(); builder.Services.AddHttpClient(); builder.Services.AddSingleton<AppGlobalSettings>(); var app = builder.Build(); // 创建作用域初始化Singleton服务 using (var scope = app.Services.CreateScope()) { var services = scope.ServiceProvider; var globalSettings = services.GetRequiredService<AppGlobalSettings>(); await globalSettings.InitializeAsync(); } // 中间件配置(保留原有代码) app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); app.Run();
3. 在组件中使用全局变量
在任意Razor组件中通过依赖注入直接使用服务中的属性:
@inject AppGlobalSettings GlobalSettings <p>全局API值:@GlobalSettings.GlobalApiValue</p>
这种方式确保应用启动时就完成API调用和数据初始化,后续所有组件都能直接获取到已准备好的全局变量,避免异步加载带来的状态不一致问题。
内容的提问来源于stack exchange,提问作者CSharpNewb
相关产品推荐
相关产品推荐

