Prism EventAggregator是否支持热订阅?如何让新订阅接收最新事件数据
实现带最后值缓存的Prism EventAggregator事件
要解决新订阅无法接收初始发布事件的问题,你需要自定义一个继承自PubSubEvent<T>的事件类,在内部维护最后一次发布的数据,并在新订阅完成时主动推送给订阅者,以此实现类似hot observable的效果。
1. 定义带缓存的自定义事件类
public class CachedPubSubEvent<T> : PubSubEvent<T> { private T _lastPublishedValue; private bool _hasPublished; public override void Publish(T payload) { _lastPublishedValue = payload; _hasPublished = true; base.Publish(payload); } public override SubscriptionToken Subscribe(Action<T> action, ThreadOption threadOption = ThreadOption.PublishedThread, bool keepSubscriberReferenceAlive = false, Predicate<T> filter = null) { var token = base.Subscribe(action, threadOption, keepSubscriberReferenceAlive, filter); // 若已有发布记录,且订阅过滤器匹配最后一次值,主动推送 if (_hasPublished && (filter == null || filter(_lastPublishedValue))) { // 按指定线程选项处理推送 switch (threadOption) { case ThreadOption.UIThread: Application.Current.Dispatcher.Invoke(() => action(_lastPublishedValue)); break; case ThreadOption.BackgroundThread: Task.Run(() => action(_lastPublishedValue)); break; default: action(_lastPublishedValue); break; } } return token; } }
2. 使用自定义事件类
发布事件时,获取该自定义事件实例:
// 发布初始事件 var eventAggregator = Container.Resolve<IEventAggregator>(); eventAggregator.GetEvent<CachedPubSubEvent<string>>().Publish("初始加载数据");
新视图初始化时订阅,将自动收到最后一次发布的值:
// 视图内订阅事件 var eventAggregator = Container.Resolve<IEventAggregator>(); eventAggregator.GetEvent<CachedPubSubEvent<string>>().Subscribe(value => { // 处理数据,包括初始发布的"初始加载数据" YourDisplayControl.Text = value; });
3. 关键注意事项
- 取消订阅后再次订阅仍能获取最后值,每次Subscribe都会触发缓存检查逻辑。
- 严格按照线程选项推送,避免UI操作在非UI线程执行导致异常。
- 针对值类型事件,通过
_hasPublished标志区分“未发布”和“发布了默认值”的场景,避免误推送。
内容的提问来源于stack exchange,提问作者Manish Basantani
相关产品推荐
相关产品推荐

