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