zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    实用图片滑块,传送带,幻灯片效果【附源码】
    Canvas 示例:4种超炫的网站动画背景效果
    GOCR.js – 使用 JS 识别出图片中的文本
    Flexslider
    30款最好的 Bootstrap 3.0 免费主题和模板
    应用 CSS3 动画实现12种风格的通知提示
    Sequence.js 实现带有视差滚动特效的图片滑块
    使用QFuture类监控异步计算的结果
    Qt中的常用容器类(解释比较全面,有插图)
    QMetaEnum获取枚举元信息
  • 原文地址:https://www.cnblogs.com/chonglu/p/15178033.html
Copyright © 2011-2022 走看看