zoukankan      html  css  js  c++  java
  • 事件聚合的思想实现事件聚合微服务组件

    0 介绍

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

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

    1 整体框架

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

    1586016466636

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

    1586016678093

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

    1586016838775

    看到有SubscriptionToken和DelegateReference,

    1586016976132

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

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

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

    2 具体代码

    来具体看看代码吧。

    1586017264883

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

    1586017322564

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

    1586017428835

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

    1586017491852

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

    1586017822371

    1586017860310

    1586017930656

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

    1586017977078

    看完订阅再来看看调用

    1586018100334

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

    1586018170530

    1586018195546

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

    1586018260251

    BackgroundEventSubscription 调用

    1586018323302

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

    1586019223480

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

    使用了泛型的订阅

    1586019263323

    1586019297099

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

    在Publish主要就是在GetExecutionStrategy方法中

    1586019634027

    filter返回true触发订阅委托。

    总结

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

    随笔分类 - Prism

    Introducing The Prism
    摘要:0 介绍 事件提供的是1对多的绑定,通过委托链实现对订阅者的调用,事件必须要通过发布者调用。同时事件订阅是强引用,事件订阅者的生命周期总是大于等于事件发布者。如果代码中事件很多就会充斥着各种事件的订阅,不利于维护。 Prism提供了EventAggregator器,可以在任何地方进行订阅,任何地方进 阅读全文
    posted @ 2020-04-05 08:50 杜金锋 阅读 (50) | 评论 (0) 编辑
     
    摘要:介绍 WPF本身就支持通知、绑定和命令,实现ViewModel和VIew之间的通讯,但相对来说功能比较少,Prism扩充了这些功能并提供更加强有力,简洁的数据绑定和命令。 0 绑定通知 WPF的绑定通知需要实现INotifyPropertyChanged接口,也就是实现一个属性改变事件,用来通知UI 阅读全文
    posted @ 2020-04-04 20:21 杜金锋 阅读 (55) | 评论 (0) 编辑
     
    摘要:介绍 介绍一个Prism的MVVM实现,主要介绍Prism如何在WPF上进行的一些封装,以实现MVVM。MVVM到底是什么呢?看一下这一幅经典的图 以前没有ViewModel这个概念,就是将Model传递到View显示,这样软件也可以工作,但却很混乱,一旦VIew要改动,一点点的改动都会造成很多代码 阅读全文
    posted @ 2020-04-01 22:39 杜金锋 阅读 (153) | 评论 (1) 编辑
     
    摘要:介绍 在软件开发过程中,总想组件式的开发方式,各个组件之间最好互不影响,独立测试。Prism的Modules很好的满足了这一点。 这个架构图很好了讲解了Prism的Modules的概念 Prism支持通过配置文件,文件夹,手动载入Module的方式,并且对Module的载入进行验证,包括重复和循环依 阅读全文
    posted @ 2020-03-30 22:57 杜金锋 阅读 (127) | 评论 (0) 编辑
     
    摘要:介绍 上一篇介绍了Region,这一篇跟Region息息相关,讲一下Region中View的加载方式及控制。 4、ViewDiscovery 在创建好Region后需要将View添加到Region中。先补充几个概念 在上一篇将了如何创建Region,现在让我们看看Region类是什么 private 阅读全文
    posted @ 2020-03-30 06:57 杜金锋 阅读 (48) | 评论 (0) 编辑
     
    摘要:介绍 之前也研究过Prism框架但是一直没有深入理解,现在项目上想把一个Winform的桌面应用程序改造成WPF程序,同时我希望程序是可测试可维护架构良好的,Prism的这些设计理念正好符合我的需求,其主要用于WPF和Xamarin,用于构建松耦合,可维护,可测试的应用程序框架,在我看到源码后也深受 阅读全文
    posted @ 2020-03-29 18:48 杜金锋 阅读 (133) | 评论 (0) 编辑
     
    摘要:ViewModelLocator 用于绑定视图的 ,以使用标准命名约定的一个ViewModel的实例。 Prism 有一个 附加属性,当设置为 调用类中的 方法 来解析视图的ViewModel时,然后将视图的数据上下文设置为该ViewModel的实例。 将 附加属性添加到每个视图: 要查找ViewM 阅读全文
    posted @ 2019-06-22 15:19 杜金锋 阅读 (205) | 评论 (0) 编辑
     
    摘要:Event Aggregator Prism库提供了一种事件机制,可以在应用程序中松散耦合的组件之间进行通信。该机制基于事件聚合器服务,允许发布者和订阅者通过事件进行通信,但仍然没有彼此直接引用。 在 提供多种发布/订阅功能。这意味着可以有多个发布者引发相同的事件,并且可以有多个订阅者收听同一事件。 阅读全文
    posted @ 2019-06-22 15:09 杜金锋 阅读 (190) | 评论 (0) 编辑
     
    摘要:Composite Commands 在许多情况下,视图模型定义的命令将绑定到关联视图中的控件,以便用户可以直接从视图中调用该命令。但是,在某些情况下,您可能希望能够从应用程序UI的父视图中的控件调用一个或多个视图模型上的命令。 例如,如果您的应用程序允许用户同时编辑多个项目,您可能希望允许用户使用 阅读全文
    posted @ 2019-06-22 15:02 杜金锋 阅读 (177) | 评论 (0) 编辑
     
    摘要:Commanding 除了提供对要在视图中显示或编辑的数据的访问之外,ViewModel还可能定义可由用户执行的一个或多个动作或操作。用户可以通过UI执行的动作或操作通常被定义为命令。命令提供了一种方便的方法来表示可以轻松绑定到UI中的控件的操作或操作。它们封装了实现操作或操作的实际代码,并有助于使 阅读全文
    posted @ 2019-06-22 14:59 杜金锋 阅读 (167) | 评论 (0) 编辑
     
    摘要:Prism 6 "Introduction" 介绍 "Initializing" 初始化 "Managing Dependencies" 管理依赖 "Modules" 模块 "Implementing MVVM" 实时MVVM "Advanced MVVM" 先进MVVM "Composing th 阅读全文
    posted @ 2019-06-22 14:57 杜金锋 阅读 (302) | 评论 (0) 编辑

    作者:杜金锋
    出处:https://www.cnblogs.com/lovexinyi/

  • 相关阅读:
    在intent-filter中的配置
    利用asynchttpclient开源项目来把数据提交给服务器
    URL的应用
    ScrollView在布局中的作用
    android中传统的创建数据库
    for (Sms sms : smsLists){}
    Android中对文件的读写进行操作
    android中的5大布局
    android复制包需要修改的几个地方
    【Unity Tips】备忘录(扫盲篇)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/12660689.html
Copyright © 2011-2022 走看看