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
相关产品推荐
相关产品推荐

