Пользовательский сервис IConfiguration в клиентской стороне Blazor - PullRequest
1 голос
/ 28 сентября 2019

Я пытаюсь получить некоторую базовую конфигурацию из файла 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 в качестве службы singleton

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

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

...