Вызов StateContainer связи компонента Blazor не работает

У меня есть служба AppState, которая имеет следующее:

public event Action OnDataChanged;
public MyObject CurrentObject { get; private set; }

public void UpdateMyObject(MyObject obj)
        {
            CurrentObject = obj;
            OnDataChanged?.Invoke();
        }

В одном компоненте я называю UpdateMyObject. Служба AppState получает правильные данные, и вызывается OnDataChanged?.Invoke().

В другом компоненте, на который предполагается подписка OnDataChanged для принятия решения об обновлении данных, у меня есть следующее:

protected override void OnInitialized()
    {
        AppStateService.OnDataChanged+= UpdateData;
    }

 private void UpdateData()
    {
        var data = AppStateService.CurrentObject;
    }

Я пытался поставить точки останова по всему компоненту «прослушивание», но ничего не получилось. Есть идеи, что я делаю не так и почему не вызывается UpdateData метод OnChanged?.Invoke из госслужбы? Предложения о том, как отладить это?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот мой код, который работает — я создал его в решении шаблона Blazor Server. Я сделал ваш объект строкой для простоты.

public class AppState
{
    public Guid Id { get; } = Guid.NewGuid();

    public event Action? OnDataChanged;

    // This is more normal for events
    public event EventHandler? DataChanged;

    public string? CurrentObject { get; private set; }

    public void UpdateMyObject(string obj)
    {
        CurrentObject = obj;
        OnDataChanged?.Invoke();
        DataChanged?.Invoke(this, new EventArgs());
    }
}

Регистрация службы

builder.Services.AddSingleton<WeatherForecastService>();
// Set as a singleton as the name suggests it's application specific and not user specific
builder.Services.AddSingleton<AppState>();

Компонент для отображения состояния

// AppStateComponent.razor
@inject AppState AppStateService
@implements IDisposable
<h3>AppStateComponent</h3>

<div class = "m-2 p-2">
    Service ID: @this.AppStateService.Id.ToString()
</div>

<div>
    Data: @this.data
</div>
@code {

    private string data = string.Empty;

    protected override void OnInitialized()
    {
        this.AppStateService.OnDataChanged += UpdateData;
    }

    private void UpdateData()
    {
        data = this.AppStateService.CurrentObject!;
        this.InvokeAsync(StateHasChanged);
    }

    public void Dispose()
    {
        this.AppStateService.OnDataChanged -= UpdateData;
    }
}

И тестовая страница

@page "/"
@inject AppState AppStateService
<div class = "m-2 p-2">
    Service ID: @this.AppStateService.Id.ToString()
</div>

<AppStateComponent />

<div class = "m-2">
    <button class = "btn btn-dark" @onclick=UpdateData>Update</button>
</div>

@code {

    private void UpdateData()
    {
        this.AppStateService.UpdateMyObject($"Updated at {DateTime.Now.ToLongTimeString()}");
    }
}
AddSingleton<AppState>(); Я думаю, что это должен быть AddScoped, иначе экземпляр AppState будет использоваться всеми соединениями.
enet 04.04.2022 23:55

@enet - вот почему я добавил комментарий - // Установить как синглтон, как следует из названия, он зависит от приложения, а не от пользователя. В противном случае, как вы говорите, сделайте это Scoped. Ждал отзывов.

MrC aka Shaun Curtis 05.04.2022 09:55

@MrCakaShaunCurtis да, у меня это тоже работает в новом серверном приложении blazor, но в корпоративном приложении, над которым я работаю, тот же код не достигает точки останова в компоненте прослушивания.

SlappingTheBass12 05.04.2022 16:09

Тогда вы не можете ссылаться на один и тот же экземпляр объекта. Добавьте идентификатор Guid в свою государственную службу и убедитесь, что идентификатор совпадает с тем, что я показал в ответе. Также обратите внимание, что я добавил Dispose в ответ. Является ли ваша государственная служба одноэлементной или ограниченной службой?

MrC aka Shaun Curtis 05.04.2022 18:02

Другие вопросы по теме