0 介绍

事件提供的是1对多的绑定,通过委托链实现对订阅者的调用,事件必须要通过发布者调用。同时事件订阅是强引用,事件订阅者的生命周期总是大于等于事件发布者。如果代码中事件很多就会充斥着各种事件的订阅,不利于维护。

Prism提供了EventAggregator器,可以在任何地方进行订阅,任何地方进行调用/发布,实例只对EventAggregator和事件类型有依赖,使用了弱引用,可以过滤消息,并可以控制回调函数线程。感觉很强大,实现应该挺复杂,但看到实现时有一种恍然大悟的感觉,喜欢这种简单而强大的实现。开始一探究竟吧!

1 整体框架

先从整体框架解析一下吧。EventAggregator

发现这只是一个集合类,保存着事件类型和事件实例,还有一个线程上下文保证线程同步。

看一下EventBase,看来所有的订阅委托都是在着保存着,因为有一个IEventSubscription列表。EventSubscription因该是订阅委托的包装器。

看到有SubscriptionToken和DelegateReference,

这边终于看到Delegate的真正存放地点了。这边存放了弱引用,委托类型和MethodInfo。

看到这边理解了,通过一个集合保存事件,这个事件内部存储着所有订阅委托。

当我们向订阅发布的时候,只要从这个集合中获取对应的事件进行订阅发布。相通了是不是觉得自己也能写一个简单的事件聚合器呢?

2 具体代码

来具体看看代码吧。

看到EventAggregator通过依赖注入,获取MessageSentEvent进行订阅。

保存了UI线程上下文和将事件类型和事件类型实例放到集合中,加锁,线程安全。

事件可以啥都没有但必须继承PubSubEvent,功能都在这里实现了。

threadOption默认是PublisherTHread,这里是说回调函数在什么线程执行,BackgroundThread就是Task创建的线程池线程,Dispatcher就是UI线程

内部订阅进行了校验(主要是委托不为空)和Token

看完订阅再来看看调用

在任何地方调用,还是去EventAggregator获取事件实例,然后调用其Publish

从这边可以看出就是依次调用列表中的委托,DispatcherEventSubscription 调用

BackgroundEventSubscription 调用

到现在还没有讲到Filter,来看看怎么实现过滤消息

在订阅的时候值接受含有Brian的消息

使用了泛型的订阅

使用了prcidate<>保存了filter委托,

在Publish主要就是在GetExecutionStrategy方法中

filter返回true触发订阅委托。

总结

事件聚合提供了一个很好的思路,我们甚至可以利用事件聚合的思想实现事件聚合微服务组件。

Prism 源码解读6-事件聚合的更多相关文章

  1. Prism 源码解读1-Bootstrapper和Region的创建

    介绍 之前也研究过Prism框架但是一直没有深入理解,现在项目上想把一个Winform的桌面应用程序改造成WPF程序,同时我希望程序是可测试可维护架构良好的,Prism的这些设计理念正好符合我的需求, ...

  2. Prism 源码解读5-数据绑定和命令

    介绍 WPF本身就支持通知.绑定和命令,实现ViewModel和VIew之间的通讯,但相对来说功能比较少,Prism扩充了这些功能并提供更加强有力,简洁的数据绑定和命令. 0 绑定通知 WPF的绑定通 ...

  3. Prism 源码解读2-View的加载和控制

    介绍 上一篇介绍了Region,这一篇跟Region息息相关,讲一下Region中View的加载方式及控制. 4.ViewDiscovery 在创建好Region后需要将View添加到Region中. ...

  4. Prism 源码解读3-Modules加载

    介绍 在软件开发过程中,总想组件式的开发方式,各个组件之间最好互不影响,独立测试.Prism的Modules很好的满足了这一点. 这个架构图很好了讲解了Prism的Modules的概念 Prism支持 ...

  5. Prism 源码解读7-导航

    介绍 Prism提供了一个非常强大的功能导航,导航的意思就是指定对应的View显示.这个导航的强大之处有: 可以设置导航前后的动作 可以指定View实例的生命周期,可以是否导航到新的View实例 提供 ...

  6. Prism 源码解读4-ViewModel注入

    介绍 介绍一个Prism的MVVM实现,主要介绍Prism如何在WPF上进行的一些封装,以实现MVVM.MVVM到底是什么呢?看一下这一幅经典的图 以前没有ViewModel这个概念,就是将Model ...

  7. AFNetworking 3.0 源码解读 总结(干货)(下)

    承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...

  8. AFNetworking 3.0 源码解读 总结(干货)(上)

    养成记笔记的习惯,对于一个软件工程师来说,我觉得很重要.记得在知乎上看到过一个问题,说是人类最大的缺点是什么?我个人觉得记忆算是一个缺点.它就像时间一样,会自己消散. 前言 终于写完了 AFNetwo ...

  9. AFNetworking 3.0 源码解读(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking

    我们应该看到过很多类似这样的例子:某个控件拥有加载网络图片的能力.但这究竟是怎么做到的呢?看完这篇文章就明白了. 前言 这篇我们会介绍 AFNetworking 中的3个UIKit中的分类.UIAct ...

随机推荐

  1. Docker实战之Zookeeper集群

    1. 概述 这里是 Docker 实战系列第四篇.主要介绍分布式系统中的元老级组件 Zookeeper. ZooKeeper 是一个开源的分布式协调服务,是 Hadoop,HBase 和其他分布式框架 ...

  2. VirtualBox Ubuntu设置静态ip亲测可行

    virtualbox重启后ip会自动分配,不固定.项目中需要配置ip地址,因此每次ip换了,需要重新配置和编译. 网上搜罗好几种方法进行配置,尝试下面这种简单并且可行: 步骤一:查看虚拟机网卡 ifc ...

  3. 简单说 通过CSS的滤镜 实现 火焰效果

    说明 上次我们了解了一些css滤镜的基础知识, 简单说 CSS滤镜 filter属性 这次我们就来用css的滤镜实现一个 火焰的效果. 解释 要实现上面的火焰效果,我们先来了解一些必要的东西. 上次我 ...

  4. Eight II HDU - 3567

    Eight II Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 130000/65536 K (Java/Others)Total S ...

  5. 读《Java并发编程的艺术》学习笔记(一)

    接下来一个系列,是关于<Java并发编程的艺术>这本书的读书笔记以及相关知识点,主要是为了方便日后多次复习和防止忘记.废话不多说,直接步入主题: 第1章  并发编程的挑战 并发编程的目的是 ...

  6. disruptor 链路实战 三

    一.创建Event类 Trade import java.util.concurrent.atomic.AtomicInteger; public class Trade { private Stri ...

  7. springboot 整合logback

    日志包使用的是springboot内置的日志包,所以我们不许要再专门导入日志包 1.logback-spring.xml配置 <?xml version="1.0" enco ...

  8. Thread同步

    今天本人给大家讲解一下多线程的线程同步,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!! 开始说线程同步前先来个小案例: 案例启:所有的类都在Demo01中, ...

  9. JS循环嵌套的执行原理

    [逆战班] 循环嵌套是指在一个循环语句中再定义一个循环语句的语法结构,外循环执行一次,内循环全部执行完,直到外循环执行完毕,整个循环结束. while.do.. while和for循环语句都可以进行嵌 ...

  10. Yaml文件,超详细讲解

    YAML文件简单介绍 YAML 是一种可读性非常高,与程序语言数据结构非常接近.同时具备丰富的表达能力和可扩展性,并且易于使用的数据标记语言. YAML全称其实是"YAML Ain't a ...