【问题标题】:How to retrieve a value from server once and store for lifetime of Blazor WASM application?如何从服务器中检索一次值并在 Blazor WASM 应用程序的生命周期内存储?
【发布时间】:2021-04-01 19:53:04
【问题描述】:

当我的 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>():

然后我可以将它注入到我需要它的任何地方,以便在我的整个应用程序中获得价值。

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

(我试图从属性获取中延迟加载它,但是由于必须异步获取值,所以这是行不通的。)

【问题讨论】:

  • 也许不是最佳答案,但您可以将 Initialize() 调用放在主组件的 OnInitializedAsync() 方法中
  • Program.cs 中的 Main 方法是 async -- 你在调用 Initialize 时遇到问题了吗? (我这样做的原因和你的非常相似)
  • @Kirk Woll - 谢谢 - 我如何在 Main 中获得对 MyGlobal 实例的引用?
  • @Angevil - 谢谢,是的,这是我尝试的第一件事,它被调用并设置,但是当组件访问 getter 时,该值仍然为空,它似乎正在使用差异实例。
  • 为了完成已接受的答案,我要补充一点,在 asp .net 中注册服务有 3 种主要方法:transient 可能是您使用的一种,每次都会创建新实例,Scoped 创建一个每个请求的新实例(在 WASM 上充当单例),并且单例只创建 1 个实例 :)

标签: blazor blazor-webassembly


【解决方案1】:

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

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 实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    相关资源
    最近更新 更多