Rafy中的EventBus

EventBus主要是干嘛使的,直接翻译叫事件总线。

是观察者模型的实现,利用它你既可以实现观察者模型的业务场景,还可以基于它的事件驱动机制来实现应用程序内组件之间的解耦与通信。

我们来看看有EventBus的总线结构图,如下:

Rafy中的EventBus使用入口是基于上图中Composer组件组合器,使用的时候都是

通过 操作 Composer.EventBus 来控制事件的注册与发布。

所以Composer起到了桥梁的作用,通过它外界可以操作EventBus,那么EventBus是什么呢

原来当我们调用Composer.EventBus的时候,Composer只是给我们返回了一个IEventBus接口的实现,如果IOC容器里面有这样的实现,就找出来返给调用者,如果没有的话,就返回Rafy内部默认的IEventBus的实现。

先让我们来看下,IEventBus内部都提供了什么接口

/// <summary>
    /// 事件总线
    /// </summary>
    public interface IEventBus
    {
        /// <summary>
        /// 向总线发布一个指定的事件。
        /// </summary>
        /// <param name="eventModel"></param>
        void Publish(object eventModel);

        /// <summary>
        /// 向总线发布一个指定的事件。
        /// </summary>
        /// <typeparam name="TEvent"></typeparam>
        /// <param name="eventModel"></param>
        void Publish<TEvent>(TEvent eventModel);

        /// <summary>
        /// 向总线订阅一个指定的事件。
        /// </summary>
        /// <typeparam name="TEvent">事件类型。</typeparam>
        /// <param name="owner">事件的监听者。</param>
        /// <param name="handler">监听函数。</param>
        void Subscribe<TEvent>(object owner, Action<TEvent> handler);

        /// <summary>
        /// 向总线取消一个指定的事件的订阅。
        /// </summary>
        /// <typeparam name="TEvent">事件类型。</typeparam>
        /// <param name="owner">事件的监听者。</param>
        void Unsubscribe<TEvent>(object owner);

        /// <summary>
        /// 获取指定事件的所有监听者。
        /// </summary>
        /// <typeparam name="TEvent">指定的事件类型。</typeparam>
        /// <returns></returns>
        IEventSubscribers GetSubscribers<TEvent>();
    }

IEventBus这个接口提供了四个功能

  1. 发布事件
  2. 订阅事件
  3. 取消订阅事件
  4. 查询事件的监听者

看完这个接口,如果我们想要实现自己的EventBus的放,应该怎么做呢?

前几天我们看到Rafy内部的IOC实现,Composer.ObjectContainer,对外提供了IOC容器

通过查询IOC容器接口:

我们只需要,添加自己的实例,然后通过IObjectCcontainer的RegisterInstance方法,把我们的IEventBus实现,注册进容器,当用户调用Composer.EventBus 系统会优先返给它我们实现的IEventBus对象。

那么接下,让我们看看,Rafy提供的IEventBus默认实例是怎么实现的

EventBus订议了一个私有的变量_SubScribers 字典,key 为对象类型,值为实现了IEventSubscribers接口的对象

    /// <summary>
    /// 某个事件的处理者列表。
    /// </summary>
    public interface IEventSubscribers
    {
        /// <summary>
        /// 对应的事件类型。
        /// </summary>
        Type EventType { get; }

        /// <summary>
        /// 返回当前已有的监听者个数。
        /// </summary>
        int Count { get; }

        /// <summary>
        /// 直接向所有监听者发布该事件。
        /// </summary>
        /// <param name="eventModel"></param>
        void Publish(object eventModel);
} 

当我们通过 Subscribe方法来订阅事件的时候,查看原码

发现方法内部,把订阅者和回调函数都存在了订阅者列表里面.

当调用者发布指定类型事件的时候,发布方法(Publish)会通知订阅者列表里面的每一个监听者.

订阅发布我们都知道了,用户怎么使用事件总线呢?

其中订阅方法SubScribe里面

EventBusArgs就是指事件订阅类型

This指当前订阅对象

E对应的回调函数,就是此类事件发布时要执行的动作

Publish new EventBusArgs 指定了要发布的事件类型,所有监听此事件的监听者

都会执行此自动的动作。

时间: 2024-08-07 21:19:28

Rafy中的EventBus的相关文章

安卓中的Eventbus

安卓中的eventbus,可以代替消息机制,广播,对线程的处理更加明确 将eventbus包拷贝到安卓的lib中,再导入库,就可以使用了在Oncreat中去注册,Ondestory中注销 package com.lyj.eventbus; import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import a

项目中应用eventbus解决的问题

在项目开发过程中,往往有些功能表面看起来简单,但实际开发的结果非常复杂,仔细分析下原因发现很多都是因为附加了许多的额外功能. 真的简单吗? 比如我们对一个电商平台的商品数据做修改的功能来讲,其实非常简单,无非就是运营人员在管理平台中对商品进行修改数据,然后点击提交,核心功能的确很简单,但可能有人会要求对商品的修改都需要增加操作日志,还有人提出需要在商品数据修改后自动去更新检索系统中的数据,有人提要在商品数据修改后需要经过审核人的审核才能生效,还有人提需要给运营人员发邮件通知等等,如此一来这个商品

Rafy 中的 Linq 查询支持(根据聚合子条件查询聚合父)

为了提高开发者的易用性,Rafy 领域实体框架在很早开始就已经支持使用 Linq 语法来查询实体了.但是只支持了一些简单的.常用的条件查询,支持的力度很有限.特别是遇到对聚合对象的查询时,就不能再使用 Linq,而只能通过构造底层查询树的接口来完成了.由于开发者的聚合查询的需求越来越多,所以本周我们将这部分进行了增强. 接下来,本文将说明 Rafy 框架原来支持的 Linq 语法,以及最新加入的聚合查询支持及用法.   使用 Linq 查询的代码示例 public WarehouseList G

8.源码分析---从设计模式中看SOFARPC中的EventBus?

我们在前面分析客户端引用的时候会看到如下这段代码: // 产生开始调用事件 if (EventBus.isEnable(ClientStartInvokeEvent.class)) { EventBus.post(new ClientStartInvokeEvent(request)); } 这里用EventBus调用了一下post方法之后就什么也没做了,就方法名来看是发送了一个post请求,也不知道发给谁,到底有什么用. 所以这一节我们来分析一下EventBus这个类的作用. 首先我们来看一下

vue中的$EventBus.$emit、$on 遇到的问题

今天在项目中遇到的一个需求: 在一个选项卡功能的页面,出现的问题是,当点击选项卡的某个选项时,会同时加载整个选项卡的数据,本身产品就很大,数据很多,所以这个问题无法忽略: 仔细研究下发现,当刚进入页面时,只会加载当前一个tab的数据,这样是正常的,但当再次点击别的tab时,之前tab的接口就都连带着再次请求一边,只要是不刷新页面,就一直切换tab,一直会有前边的tab数据接口重新请求,项目中tab实现是用的饿了么ui的tab选项卡,在研究了饿了么ui之后发现使用上没有什么问题,而且是子组件的v-

NopCommerce商城系统中的eventbus

nopcommerce中事件发布与订阅是相对比较规范的, 1.IConsumer 消费者 public interface IConsumer<T> { void HandleEvent(T eventMessage); } 2.IEventPublisher 事件发布者 事件调用者,程序入口, /// <summary> /// Evnt publisher /// </summary> public interface IEventPublisher { /// &

vue中eventbus被多次触发(vue中使用eventbus踩过的坑)【bus.$on事件被多次绑定】

问题描述:只要页面没有强制刷新,存在组件切换,bus.$on方法会被多次绑定,造成事件多次触发 触发bus.$on中绑定的方法.png bus.$on多次绑定.png 解决办法:在每次调用方法前先解绑事件( bus.$off ),然后在重新绑定( bus.$on ) bus.$off("backUpLevel"); bus.$on('backUpLevel', () => { if(self.ONION.length <= 1){ self.jumpSubDir() }el

EventBus在Android中的简单使用

EventBus是一个方便与Android中各组件通信的开源框架,开源地址;https://github.com/greenrobot/EventBus.EventBus功能非常强大 ,今天在做一个功能时.遇到了点击事件的冲突问题及数据传递更新问题. 详细点就是在能够上下拉刷新的ListView的Header上有GridView.此时,GridView的OnitemClick事件与ListView的OnItemClick事件冲突. 并且我在实现 Griview的点击事件时,还要进行数据传递. 解

Android组件间通信——EventBus

在Android开发中,组件间通信一直是一个不可忽视的部分.当然,组件之间的通信有很多种方式可以选择,本文就利用EventBus通信的方式进行论述. EventBus是一个第三方框架,它的简单使用分为如下几步: 1. 下载框架源码,并导入工程中. 下载地址:https://github.com/greenrobot/EventBus 如果需要看如何导入并依赖工程,请转到另一篇博文:<Eclipse导入所依赖的Android项目> 2. 定义事件类,并广播事件 例如下面这个自定义事件类Messa