我正在尝试在启动时在客户端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;
}
}
所有这些都工作正常,但是我想在浏览器中加载应用程序时准备好此配置,因此正如我在其他Question中的“ 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应用程序永远不会启动,所有显示空白白页的文本正在加载....,甚至没有任何错误,但是每隔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;
}
我必须手动设置每个属性,也需要摆脱这一点