Пользовательский сервис IConfiguration в Client SIde Blazor

Я пытаюсь иметь некоторую базовую конфигурацию из файла json в одноэлементную службу внутри моего приложения Blazor на стороне клиента при запуске.

Ниже мой код настройки

Файлы 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; }
}

Чем файл json с именем environment.json внутри wwwroot как 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 никогда не запускается, все оно показывает пустую белую страницу с текстом Загрузка ...., даже без какой-либо ошибки, но каждые 5 минут всплывающее окно - страница занимает слишком много времени для загрузки с двумя вариант подождать и закрыть.

Если я немного изменю этот код с

return http.GetJsonAsync<AppConfig>("ConfigFiles/environment.json").GetAwaiter().GetResult();

to

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;
    }

Мне нужно установить каждое свойство вручную, от этого тоже нужно избавиться


person Saurabh    schedule 28.09.2019    source источник
comment
Использование .Result действительно неправильный путь.   -  person Henk Holterman    schedule 28.09.2019
comment
Что именно происходит во время загрузки приложения в браузере? Что сейчас отсутствует или не работает? Вам нужны значения конфигурации при запуске?   -  person Henk Holterman    schedule 28.09.2019
comment
Помещая его в BaseComponent, файл будет читаться каждый раз, когда отображается любой производный компонент. Это намерение?   -  person Henk Holterman    schedule 28.09.2019
comment
@HenkHolterman, нужны значения конфигурации при запуске? - Да, он не должен читать файл снова и снова, он должен читать набор IAppConfig в startup.cs   -  person Saurabh    schedule 29.09.2019
comment
Также я добавил IsFixed = true, так как он никогда не изменится. После добавления IsFixed = true конфигурация доступна для компонентов, которые идут после Index.razor, для Index.razor (первая страница) он перестает показывать информацию о конфигурации, удален IsFixed, тогда информация будет доступна для index.razor также   -  person Saurabh    schedule 30.09.2019
comment
Поскольку веб-сборка Blazor инициализируется в браузере, ваш файл конфигурации будет прочитан один раз для каждого пользователя.   -  person Pankaj Rawat    schedule 20.01.2020