客户端SIde Blazor中的自定义IConfiguration服务

时间:2019-09-28 14:48:07

标签: c# blazor .net-core-3.0 asp.net-core-3.0 blazor-client-side

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

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

0 个答案:

没有答案