Blazor Server中如何解除异步方法与委托事件的绑定
解决Blazor Server仓储事件解绑问题及优化方案
一、直接解决匿名方法解绑问题
方案1:使用显式命名的异步方法
把原匿名异步逻辑抽成组件内的私有方法,绑定和解绑复用同一个方法实例,即可正常解除订阅:
// 组件X内代码 private Action? _eventHandler; protected override void OnInitialized() { _eventHandler = HandleSomethingChanged; RepositoryService.SomethingChanged += _eventHandler; } private async void HandleSomethingChanged() { await AnAsynchronousMethod(); } public void Dispose() { if (_eventHandler != null) { RepositoryService.SomethingChanged -= _eventHandler; } }
方案2:保存匿名方法的引用
如果必须使用匿名方法(比如需要捕获组件局部变量),可以将匿名方法的引用存到组件字段中,后续解绑时直接使用该字段:
// 组件X内代码 private Action? _anonymousHandler; protected override void OnInitialized() { _anonymousHandler = async () => await AnAsynchronousMethod(); RepositoryService.SomethingChanged += _anonymousHandler; } public void Dispose() { if (_anonymousHandler != null) { RepositoryService.SomethingChanged -= _anonymousHandler; } }
二、更优雅的架构优化方案
直接在仓储中添加事件违反单一职责原则(仓储核心职责是数据访问,不应承担事件通知功能),推荐以下两种更高效的实现方式:
1. 用MediatR实现跨组件通知
借助MediatR的Notification机制处理跨组件事件:
- 定义
SomethingChangedNotification通知类 - 仓储执行CRUD操作后,发布该通知
- 组件X注册为该通知的消费者,收到通知后执行数据更新逻辑
- 组件Y触发变更时,仓储自动发布通知,组件X同步更新
这种方式无需手动处理绑定和解绑,MediatR会自动管理,同时避免仓储职责混乱。
2. 封装独立的状态通知服务
创建专门的DataChangeNotificationService统一处理数据变更通知:
public class DataChangeNotificationService { public event Action? SomethingChanged; public void TriggerSomethingChanged() { SomethingChanged?.Invoke(); } }
仓储中注入该服务,CRUD操作完成后调用TriggerSomethingChanged();组件X、Y注入该服务进行事件绑定/解绑。这种方式将通知职责从仓储分离,架构更清晰。
内容的提问来源于stack exchange,提问作者Youssef Bennour Sahli
相关产品推荐
相关产品推荐

