1-й вы регистрируете одноэлементный экземпляр
services.AddSingleton<AppState, AppState>();
это выглядит немного странно для меня.ИМХО, это должно быть
services.AddSingleton<IAppState, AppState>();
или
services.AddSingleton<AppState>();
Но это не проблема.
Вы внедряете этот сервис в компонент, который хорош
[Inject]
public AppState AppState { get; set; }
И вы стираете этот экземпляр компонента новым, полученным из веб-интерфейса
protected override async Task OnInitializedAsync()
{
AppState = await Http.GetJsonAsync<AppState>(ConfigFiles.GetPath("appsettings.json"));
await Task.FromResult(0);
}
Их код снова странный, это должно быть
protected override async Task OnInitializedAsync()
{
AppState = await Http.GetJsonAsync<AppState>(ConfigFiles.GetPath("appsettings.json"));
}
Но этоне сбрасывает одиночный экземпляр, который вы добавляете во второй компонент.Это просто заменит экземпляр в вашем 1-м компоненте.
- Вы должны зарегистрировать свой сервис с
services.AddSingleton<AppState>(provider =>
{
var http = provider.GetRequiredService<HttpClient>();
return http.GetJsonAsync<AppState>(ConfigFiles.GetPath("appsettings.json")).ConfigureAwait(false).GetAwaiter().GetResult();
});
Таким образом, вы сделаете всего один вызов appsettings.JSON в течение жизни приложения.(ИМХО, не рекомендуется использовать appsettings.json , вам следует использовать другой файл конфигурации, например clientsettings.json для примера).
- И удалите
OnInitializedAsync
код.
Async
Но на самом деле лучший способ добиться этого - зарегистрировать Task
, возвращающий ваши настройки
services.AddSingleton(provider =>
{
var http = provider.GetRequiredService<HttpClient>();
return http.GetJsonAsync<AppState>("appsettings.json");
});
Вы можете добавить его в свои компоненты с помощью
[Inject]
public Task<AppState> AppStateAsync { get; set; }
public AppState AppState { get; set; }
protected override async Task OnInitializedAsync()
{
AppState = await AppStateAsync;
}
и использовать с
@page "/"
@inherits IndexComponent
<p>@AppState.BaseUrl</p>