我试图在启动时在我的客户端 blazor 应用程序中进行一些从 json 文件到单例服务的基本配置。
下面是我的代码设置
AppConfig 和 IAppConfig 文件
interface IAppConfig
{
string BaseUrl { get; set; }
string Source { get; set; }
}
和
public class AppConfig : IAppConfig
{
public string BaseUrl { get; set; }
public string Source { get; set; }
}
比 wwwroot 中名为 environment.json 的 json 文件为 wwwroot/ConfigFiles/environment.json
比读取此文件的服务
interface ISharedServices
{
Task<AppConfig> GetConfigurationAsync();
}
和
public class SharedServices : ISharedServices
{
private HttpClient Http { get; set; }
public SharedServices(HttpClient httpClient)
{
Http = httpClient;
}
public async Task<AppConfig> GetConfigurationAsync()
{
return await Http.GetJsonAsync<AppConfig>("ConfigFiles/environment.json");
}
}
现在我将它调用到我首先加载的组件中
public class IndexComponent : ComponentBase
{
[Inject]
internal IAppConfig AppConfig { get; set; }
[Inject]
internal ISharedServices sharedServices { get; set; }
protected override async Task OnInitializedAsync()
{
var appconfig = await sharedServices.GetConfigurationAsync();
AppConfig = appconfig;
}
}
所有这一切都很好,但我想在浏览器中加载应用程序时准备好这个配置,所以正如我的另一个问题中的“auga from mars”所建议的那样,我在startup.cs中尝试了下面的代码,此时我将IAppConfig添加为单例服务
services.AddSingleton<IAppConfig, AppConfig>(provider =>
{
var http = provider.GetRequiredService<HttpClient>();
return http.GetJsonAsync<AppConfig>("ConfigFiles/environment.json").GetAwaiter().GetResult();
});
但是,使用此代码购买的 blazor 应用程序永远不会启动,它只显示一个带有文本 Loading.... 的空白白页,甚至没有任何错误,但每 5 分钟弹出显示页面需要太多时间来加载两个等待和关闭的选项。
如果我从
return http.GetJsonAsync<AppConfig>("ConfigFiles/environment.json").GetAwaiter().GetResult();
至
return http.GetJsonAsync<AppConfig>("ConfigFiles/environment.json").Result;
比它说的 - “最大调用堆栈大小超过”
如何在启动时准备好配置?
更新1:
一点更新
在 Basecomponent 文件中,代码是
protected override async Task OnInitializedAsync()
{
var appconfig = await sharedServices.GetConfigurationAsync();
AppConfig.BaseUrl = appconfig.BaseUrl;
AppConfig.Source = appconfig.Source;
}
我必须手动设置每个属性,也需要摆脱这个