如何从服务器检索一次值并在 Blazor WASM 应用程序的生命周期内存储?
How to retrieve a value from server once and store for lifetime of Blazor WASM application?
当我的 Blazor 应用程序首次加载时,我想从服务器获取一个值并在应用程序的生命周期内使用该值。
该值只能通过异步 HttpClient 调用检索一次。到目前为止,我的方法是创建一个可以获取和 return 这个加载值的接口:
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 中完成吗?如果是怎么办?
(我尝试从 属性 获取中延迟加载它,但是由于必须异步获取该值,所以这是行不通的。)
根据你的评论,我明白是什么让你失望了。有多种方法可以注册服务,但对于您的场景,我会使用允许您直接注册服务(自然是单例)实例的重载。所以不是这个:
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
的实例,它都会 return 您的 MyGlobal
.
的(已初始化)实例
当我的 Blazor 应用程序首次加载时,我想从服务器获取一个值并在应用程序的生命周期内使用该值。
该值只能通过异步 HttpClient 调用检索一次。到目前为止,我的方法是创建一个可以获取和 return 这个加载值的接口:
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 中完成吗?如果是怎么办?
(我尝试从 属性 获取中延迟加载它,但是由于必须异步获取该值,所以这是行不通的。)
根据你的评论,我明白是什么让你失望了。有多种方法可以注册服务,但对于您的场景,我会使用允许您直接注册服务(自然是单例)实例的重载。所以不是这个:
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
的实例,它都会 return 您的 MyGlobal
.