You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor MAUI中监听服务属性变更更新组件UI的最优方案问询

Blazor MAUI中服务数据变更同步到组件的最佳实践

场景说明

我在Blazor MAUI应用中维护了一个EmployeeService服务,它通过内部定时调度器定期更新存储的业务数据。现有一个Blazor组件需要读取该服务的值,希望实现服务数据变更时,组件UI自动同步更新的效果。

现有简化代码

EmployeeService.cs

public class EmployeeService {
    
    public int NumberOfEmployees { get; private set; }

    public EmployeeService() {
        // 初始化定时调度逻辑,定期触发RecalculateNumberOfEmployees()
    }

    private async void RecalculateNumberOfEmployees() {
        NumberOfEmployees += 1;
    }
}

Employees.razor

@page "/employees"
@inject EmployeeService Service

Number of employees: @Service.NumberOfEmployees

@code {
    
}

已排查的方案及弊端

我了解到一种常见方案是在组件中使用定时器,定期调用StateHasChanged()强制刷新UI。但这种轮询方式会浪费系统资源,属于典型的反模式,因此不考虑采用。

我的初步实现思路

我计划让EmployeeService维护一个EventCallback监听列表,允许任意组件注册回调以监听数据变更,组件卸载时注销对应的回调:

修改后的EmployeeService核心代码

public List<EventCallback> listeners { get; private set; } = new List<EventCallback>();

// 注册回调,可立即触发一次确保UI同步当前值
public async Task RegisterCallback(EventCallback callback) {
    listeners.Add(callback);
    await callback.InvokeAsync();
}

// 注销回调
public void DeregisterCallback(EventCallback callback) {
    listeners.Remove(callback);
}

private async void RecalculateNumberOfEmployees() {
    NumberOfEmployees += 1;
    // 数据更新后通知所有监听组件,用ToList避免遍历中集合变更报错
    foreach (var callback in listeners.ToList())
    {
        await callback.InvokeAsync();
    }
}

组件侧实现(Employees.razor)

@page "/employees"
@inject EmployeeService Service
@implements IDisposable

Number of employees: @Service.NumberOfEmployees

@code {
    protected override async Task OnInitializedAsync()
    {
        var updateCallback = EventCallback.Factory.Create(this, () => StateHasChanged());
        await Service.RegisterCallback(updateCallback);
    }

    public void Dispose()
    {
        var updateCallback = EventCallback.Factory.Create(this, () => StateHasChanged());
        Service.DeregisterCallback(updateCallback);
    }
}

咨询问题

在落地这个方案前,我想确认:是否有更适配Blazor/MAUI生态的设计模式来实现这类需求?我直觉认为服务数据变更通知组件的功能应该是框架原生支持的,但暂未找到官方的推荐实现方式。

内容的提问来源于stack exchange,提问作者user0000001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:48:41