Blazor 的 MediatR 通知 (WASM) - 事件处理程序不更新 UI

问题描述 投票:0回答:2

我正在尝试在客户端 Blazor 应用程序中连接 MediatR,纯粹是为了处理组件之间的事件通知。

事件已发布,并由带有处理程序的单独组件拾取,但我无法从处理程序更新 UI。

我相信原因是 MediatR 调用的处理程序与 UI 组件使用的处理程序不是同一实例。如果这有道理吗?

有人在 Blazor 中使用过 MediatR 通知吗?

发布组件:

@inject MediatR.IMediator _mediator

<h3>Sender</h3>

<button @onclick="SendNotification">Send notification</button>

@code {

    private void SendNotification()
    {
        _mediator.Publish(new MyNotification { Message = "Hello World!" });
    }

}

订阅组件:

@using MediatR;
@implements INotificationHandler<MyNotification>;

<h3>Receiver</h3>

<p>Message: @Message</p>

@code {

    private string Message { get; set; } = "[No message]";

    public Task Handle(MyNotification notification, System.Threading.CancellationToken cancellationToken)
    {
        Message = notification.Message; // <-- THIS DOES NOT UPDATE THE UI

        return Task.CompletedTask;
    }

}

通知:

public class MyNotification : INotification
{
    public string Message { get; set; }
}

主要:

public static async Task Main(string[] args)
{
    var builder = WebAssemblyHostBuilder.CreateDefault(args);
    builder.RootComponents.Add<App>("app");

    builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
    builder.Services.AddMediatR(typeof(Program));

    await builder.Build().RunAsync();
}
blazor blazor-client-side blazor-webassembly mediatr asp.net-blazor
2个回答
0
投票

这个想法是您的

Blazor
应用程序应该监听
MediatR
命令并在发生这种情况后更新
UI
组件。为此,您需要:

  1. 注意由 MediatR 处理程序触发的
    状态管理
    事件。
  2. 使您的
    Blazor
    组件订阅此事件并使用
    StateHasChanged
    刷新 UI - 您可以在 Blazor 中组件之间通信的 3 种方法一文中查看“状态容器”示例。

0
投票

我对这个问题的解决方案是使用像 EventAggregator.Blazor 这样的库将消息直接路由到我的页面和组件中。

问题详情: 我在 Blazor Wasm 中也遇到了这个问题。从文档看来,所有 INotificationHandler 实例都将被创建为临时服务。所以 直接在页面上实现 INotificationHandler 只会创建一个新的页面实例。

© www.soinside.com 2019 - 2024. All rights reserved.