Обмен данными через службу в ASP.NET Blazor (на стороне клиента) - PullRequest
1 голос
/ 27 сентября 2019

Я использую, чтобы иметь общую службу в MVC Application, зарегистрировать его как Transient службы и получить доступ к его стоимостям через все приложение без каких-либо проблем.

1002 * Я пытался реализовать то же самый механизм внутри моего клиента на сторону blazor приложения

Сначала создан класс AppState

public class AppState
{
    public string BaseUrl { get; set; }
}

, зарегистрированный в качестве службы

services.AddSingleton<AppState, AppState>();

Используется в компоненте индекса компонентов Blazor

public class IndexComponent : ComponentBase
{
    [Inject]
    HttpClient Http { get; set; }

    [Inject]
    public AppState AppState { get; set; }

    protected override async Task OnInitializedAsync()
    {
        AppState = await Http.GetJsonAsync<AppState>(ConfigFiles.GetPath("appsettings.json"));
        await Task.FromResult(0);
    }
}

Попытка печати базыадрес в index.razor файла

@page "/"
@inherits IndexComponent

<p>@AppState.BaseUrl</p>

до Здесь его хорошо, теперь, как это содержит базовый URL, так что я хотел, чтобы получить доступ к нему в другом компоненте

public class MiniCartComponent : ComponentBase
{
    [Inject]
    public AppState AppState { get; set; }

    protected override async Task OnInitializedAsync()
    {
        await Task.FromResult(0);
    }
}

Здесь пусто, яне знаю, почему

1021 * Я пытался напечатать его в бритву файл
@inherits MiniCartComponent
<p>@AppState.BaseUrl</p>

Здесь пусто, он зарегистрирован в качестве службы для обмена данными по компонентам, она не должна иметь значение поперекприложение, когда оно установлено ??

1 Ответ

3 голосов
/ 27 сентября 2019

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>
...