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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:20:25