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 指定了要发布的事件类型,所有监听此事件的监听者

都会执行此自动的动作。

Rafy中的EventBus的更多相关文章

  1. 项目中应用eventbus解决的问题

    在项目开发过程中,往往有些功能表面看起来简单,但实际开发的结果非常复杂,仔细分析下原因发现很多都是因为附加了许多的额外功能. 真的简单吗? 比如我们对一个电商平台的商品数据做修改的功能来讲,其实非常简 ...

  2. Rafy中的IOC

    Rafy是什么可以通过下面博客来了解 Rafy 领域实体框架演示(3) - 快速使用 C/S 架构部署 - BloodyAngel - 博客园 以下是看源码中的一点记录,供以后学习使用 主要是Rafy ...

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

    为了提高开发者的易用性,Rafy 领域实体框架在很早开始就已经支持使用 Linq 语法来查询实体了.但是只支持了一些简单的.常用的条件查询,支持的力度很有限.特别是遇到对聚合对象的查询时,就不能再使用 ...

  4. Android中的eventBus传值

    第一步:在build.gradle中添加依赖dependencies { compile 'org.greenrobot:eventbus:3.0.0'} 第二步:创建一个 Event类: 注意:en ...

  5. vue中的eventBus

    在vue2中,父子组件传递数据,父组件可以直接传递数据进子组件,而子组件通过调用父组件传递进来的方法,将自己的数据传递回去. 那兄弟组件之间,或者是兄弟组件的子组件之间如何传递呢? 当然vuex是一种 ...

  6. Android中的EventBus

    1.分析 EventBus是一个针对Android的事件发布和订阅的框架,主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传 ...

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

    我们在前面分析客户端引用的时候会看到如下这段代码: // 产生开始调用事件 if (EventBus.isEnable(ClientStartInvokeEvent.class)) { EventBu ...

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

    今天在项目中遇到的一个需求: 在一个选项卡功能的页面,出现的问题是,当点击选项卡的某个选项时,会同时加载整个选项卡的数据,本身产品就很大,数据很多,所以这个问题无法忽略: 仔细研究下发现,当刚进入页面 ...

  9. vue中的$EventBus.$emit、$on的应用

    今天在项目中遇到的一个需求: 在一个选项卡功能的页面,出现的问题是,当点击选项卡的某个选项时,会同时加载整个选项卡的数据,本身产品就很大,数据很多,所以这个问题无法忽略: 仔细研究下发现,当刚进入页面 ...

随机推荐

  1. Linux 历史信息history显示执行时间

    fc命令 fc命令自动掉用vi编辑器修改已有历史命令,当保存时立即执行修改后的命令,也可以用来显示历史命令.fc命令编辑历史命令时,会自动调用vi编辑器.fc保存文件后,会自动执行所编辑过的命令. 测 ...

  2. YC全球总裁:我招揽陆奇好多年,如今终于如愿了!

    简评:YC 老大多年来一直在努力招揽陆奇,终于如愿了. YC 总裁 Sam Altman 在 8 月 14 日,发布了关于陆奇以及 YC 中国的公告,全文如下: 我非常荣幸地宣布,陆奇加入 YC 并且 ...

  3. 常见 CentOS 7 安装问题

    问题一: 解决办法:网上安装文章推荐的的刻录工具多是 ultraiso,有时候可能会出现错误,这时候最简单的解决办法是换由RedHat推荐的刻录工具,fedora media writer,不过这个工 ...

  4. Java NIO学习与记录(八): Reactor两种多线程模型的实现

    Reactor两种多线程模型的实现 注:本篇文章例子基于上一篇进行:Java NIO学习与记录(七): Reactor单线程模型的实现 紧接着上篇Reactor单线程模型的例子来,假设Handler的 ...

  5. request.getSession(true/false)的区别

    javax.servlet.http.HttpServletRequest接口有两个方法:getSession(boolean)和getSession(). 具体什么区别,跟踪源码分析下,先摆出结论: ...

  6. 【算法笔记】B1053 住房空置率

    看了半天发现是题目理解错了,可能空置的里面观察期超过D则判定空置,而不是用电量低于e的天数超过D. code #include <bits/stdc++.h> using namespac ...

  7. session_destroy()和session_unset()的理解

    session_destroy 是注销所有的session变量,并且结束session会话目前是删除当前用户对应的session文件以及释放session id值 ,但是但是 内存中的$_SESSIO ...

  8. [转] Nexus OSS 3.xx 体验

    [From] https://blog.csdn.net/qq250782929/article/details/51605965 Nexus Manager OSS 3.0 —Maven Repos ...

  9. 【Maven学习】maven中依赖的配置详解

    根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或多个项目依赖.每个依赖可以包含的元素有: groupId,artifactId和version ...

  10. Hibernate3.3.2_ID生成策略

    1,xml生成id generator:常用四个:native.identity.sequence.uuid. Annotation: 1,@GeneratedValue: a)自定义ID b)AUT ...