1

我试图在启动时在我的客户端 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;
    }

我必须手动设置每个属性,也需要摆脱这个

4

0 回答 0