Prism事件聚合器(Event/发布订阅)
什么是Prism事件聚合器#
Prism 库提供了一种事件机制,可以实现应用程序中松散耦合组件之间的通信。这种机制基于事件聚合器服务,允许发布者和订阅者通过事件进行通信,并且彼此之间仍然没有直接引用。简单来说就是提供了一个多播发布/订阅功能。
一图了解Prism的事件聚合器,这玩意实现原理是观察者模式,观察者模式也就是常说的发布/订阅模式。
使用Prism聚合器#
1、创建事件
这里我们创建一个MessageEvent类并继承自PubSubEvent,并传入一个MessageModel对象泛型,也可以传入string,int 等等基础类型
namespace MainModule.Event
{
public class MessageEvent : PubSubEvent<MessageModel>
{
}
public class MessageModel
{
public int Code { get; set; }
public string Message { get; set; }
public string Data { get; set; }
}
}
2、订阅事件
通过构造注入IEventAggregator,并通过IEventAggregator的GetEvent获取定义的消息,再通过Subscribe方法注册,Subscribe是一个委托方法
public MainWindow(IEventAggregator aggregator)
{
InitializeComponent();
_aggregator = aggregator;
_aggregator.GetEvent<MessageEvent>().Subscribe(ShowMethod, arg => arg.Code == 200); ;
}
3、发布事件
private readonly IEventAggregator _aggregator;
//构造注入
public MainWindowViewModel(IEventAggregator aggregator)
{
_aggregator = aggregator;
}
//创建一个命令,当执行该命令时执行发布事件的逻辑
PubSubEventCommand = new DelegateCommand(PubSubEventMessage);
//发布事件方法
private void PubSubEventMessage()
{
MessageModel message = new MessageModel
{
Code = 200,
Message = "操作成功",
Data = "{}"
};
_aggregator.GetEvent<MessageEvent>().Publish(message);
}
这样,一个发布/订阅的事件就完成了,也可以在任何时候取消事件注册,只需要调用Unsubscribe方法即可
_aggregator.GetEvent<MessageEvent>().Unsubscribe(ShowMethod);
由于它是多播的,你可以在任意多个地方进行发布或订阅。
效果图:
过滤器#
在真实业务场景中,可能需要达到某个特定要求时才进行注册,这时候我们就可以用到Predicate<TPayload>
过滤器
_aggregator.GetEvent<MessageEvent>().Subscribe(ShowMethod, arg => arg.Code == 200);
把后面这个参数的过滤变更一下,假设Code值为500,打个断点看一下
可以看出,不满足过滤器的条件时,即使发布了事件,注册事件的委托方法也不会被触发执行。
有兴趣可以去学习下观察者模式,此前有一篇文章也类似于这种写法,当然肯定是没有这个写的出神入化,传送门:观察者模式的"最佳实践"
本文的示例代码在该github仓库:https://github.com/luchong0813/PrismLearning
作者:傲慢与偏见
出处:https://www.cnblogs.com/chonglu/p/15178033.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
声明:如果本文对您有帮助,请点击【推荐】您的赞赏将鼓励我继续创作!想跟我一起进步么?那就【关注】我吧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构