Loading

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);

由于它是多播的,你可以在任意多个地方进行发布或订阅。

效果图:

4

过滤器

在真实业务场景中,可能需要达到某个特定要求时才进行注册,这时候我们就可以用到Predicate<TPayload>过滤器

image-20210823221608468

 _aggregator.GetEvent<MessageEvent>().Subscribe(ShowMethod, arg => arg.Code == 200); 

把后面这个参数的过滤变更一下,假设Code值为500,打个断点看一下

3

可以看出,不满足过滤器的条件时,即使发布了事件,注册事件的委托方法也不会被触发执行。

有兴趣可以去学习下观察者模式,此前有一篇文章也类似于这种写法,当然肯定是没有这个写的出神入化,传送门:观察者模式的"最佳实践"

本文的示例代码在该github仓库:https://github.com/luchong0813/PrismLearning

posted @ 2021-08-23 22:28  傲慢与偏见luc  阅读(4933)  评论(0编辑  收藏  举报