如何从服务器检索一次值并在 Blazor WASM 应用程序的生命周期内存储?

时间:2021-04-01 19:53:04

标签: blazor blazor-webassembly

当我的 Blazor 应用程序首次加载时,我想从服务器获取一个值并在应用程序的整个生命周期中使用该值。

该值只能通过异步 HttpClient 调用检索一次。到目前为止,我的方法是创建一个可以获取并返回此加载值的接口:

public interface IMyGlobal
{
    public Task Initialise();

    public string Value { get; set; }
}

然后在我的实现中

public class MyGlobal : IMyGlobal
{
    private readonly HttpClient _httpClient;

    public MyGlobal (HttpClient httpClient)
    {
        _httpClient = httpClient;
    }

    private async Task<Response> GetMyValue()
      { // This just loads it from a web-service asynchronously - removed for simplicity }

    public async Task Initialise()
    {
        var response = await GetMyValue();

        _value = response.Value;
    }

    public string Value
    {
        get => _value;
        set => _value;
    }

    private string _value;
}

Program.cs 中,我注册了此服务:

builder.Services.AddHttpClient<IMyGlobal, MyGlobal>():

然后我可以将它注入到我需要的任何地方,目的是可以在整个应用程序中获取 Value。

但是,我需要调用 Initialise,这应该在 Program.cs 中完成吗?如果是,如何?

(我试图从属性获取中延迟加载它,但由于必须异步获取值,所以不起作用。)

1 个答案:

答案 0 :(得分:1)

根据您的评论,我明白是什么让您失望了。有多种注册服务的方法,但对于您的场景,我会使用重载,允许您直接注册服务的(自然单例)实例。所以,而不是这样:

builder.Services.AddHttpClient<IMyGlobal, MyGlobal>():

用以下内容替换它:

var serviceProvider = builder.Services.BuildServiceProvider();
var myGlobal = new MyGlobal(serviceProvider.GetService<HttpClient>());
await myGlobal.Initialize();
builder.Services.AddSingleton<IMyGlobal>(myGlobal);

现在,每当您请求 IMyGlobal 的实例时,它都会返回您的(初始化的)MyGlobal 实例。