EventBus总线讲解
在我们公司经常用到总线,具体的总线是什么让我理解我也不清楚,但是在这几个月下来,我已经知道总线如何使用,现在加上示例讲解总线如何使用。
1. 首先我们的新建一个类,这个类其实是用于总线传递的模型
using System;
namespace PurchaseDevices.Model.CommonModel
{
/// <summary>
/// 事件传递参数
/// </summary>
/// <typeparam name="T"></typeparam>
public class FlowDataEventArgs<T> : EventArgs
{
public FlowDataEventArgs(T data)
{
Data = data;
}
public T Data { get; set; }
}
}
2. 建立一个类(FlowServiceBus),里面来写总线的方法。
public class FlowServiceBus
{
static FlowServiceBus _flowServiceBus;
public static FlowServiceBus Instance
{
get
{
if (_flowServiceBus == null) _flowServiceBus = new FlowServiceBus();
return _flowServiceBus;
}
}
}
4. 写一个方法,里面挂总线
public class FlowServiceBus
{
static FlowServiceBus _flowServiceBus;
public static FlowServiceBus Instance
{
get
{
if (_flowServiceBus == null) _flowServiceBus = new FlowServiceBus();
return _flowServiceBus;
}
}
public void ConfigMsgDispachRule(){
//挂总线
}
}
5. 先讲一讲我们传统的调用另一个类的方法
//新建一个对象模型类
public class FarmerCardOrRateSellModel
{
public FarmerCardOrRateSellModel()
{
PackageHead = 0xAA;
FixedLength = 11;
}
/// <summary>
/// 帧头
/// 帧开始标记,0xAA
/// </summary>
public byte PackageHead { get; set; }
/// <summary>
/// 接收者,标识数据要发给谁
/// 1磅码主机、2定级键盘、3交烟刷卡。
/// </summary>
public byte Receiver { get; set; }
/// <summary>
/// 发送者,标识数据是谁发出
/// 1磅码主机、2定级键盘、3交烟刷卡。
/// </summary>
public byte Sender { get; set; }
/// <summary>
/// Zigbee通信地址
/// 1~15
/// </summary>
public byte ZigbeeAddress { get; set; }
/// <summary>
/// 帧序号
/// 0~255
/// </summary>
public byte FrameNumber { get; set; }
/// <summary>
/// 命令码
/// </summary>
public byte Command { get; set; }
/// <summary>
/// 数据区字节数
///
/// </summary>
public int DataLength { get; set; }
/// <summary>
/// 数据区,可无(数据区为0)
/// </summary>
public byte[] Data { get; set; }
/// <summary>
/// 从receiver到整个data的和校验
/// </summary>
public byte Crc { get; set; }
/// <summary>
/// 定长 除开数据区的长度 定长为11
/// </summary>
public int FixedLength { get; set; }
}
//我们现在要做的是 根据不同的发送者Sender ,进入不同的方法
private void DisSenderToDisWay(FarmerCardOrRateSellModel farmerCardOrRateSellModel)
{
DevTypeEnum devTypeEnum = (DevTypeEnum)farmerCardOrRateSellModel.Sender; //这里是一个枚举,这里就不详细讲解了,这里就是说 //Sender有不同的值
switch (devTypeEnum)
{
case DevTypeEnum.CardDev:
CardDev cardDev=new CardDev ();
cardDev.CardDevWay(farmerCardOrRateSellModel);
break;
case DevTypeEnum.LevelDev:
LevelDev levelDev=new LevelDev();
levelDev.LevelDevWay(farmerCardOrRateSellModel);
break;
default:
Logger.GetInstance().Warn("无法识别的发送者");
break;
}
}
//当sender为CardDev要执行的方法
public class CardDev{
public void CardDevWay(FarmerCardOrRateSellModel farmerCardOrRateSellModel){
//执行的方法
}
}
//当sender为LevelDev要执行的方法
public class LevelDev{
public void LevelDevWay(FarmerCardOrRateSellModel farmerCardOrRateSellModel){
//执行的方法
}
}
}
在传统的方法中 ,一个类要引用另一个类的方法,我们必须new 一个对象,然后引用方法。这样写没有错,我以前也是这样写的,对于一些不复杂程序中的我么可以这样写,但是在一些与设备交互的程序中,多半是总线将各个方法连接起来,我们不必关心谁是发送者,谁是接收者,每个方法只关心我拿到这个传递过来的值,该干什么,我也不必关心我应该把这个方法的结果发给谁用。这样低耦合。
现在我们来讲讲用总线的方法,应该怎么写:
还是保留FarmerCardOrRateSellModel类。
下面这个方法 我们用事件来写:
写事件:
public event EventHandler<FlowDataEventArgs<FarmerCardOrRateSellModel>> OnReceiveCardDataEventHadler;
public event EventHandler<FlowDataEventArgs<FarmerCardOrRateSellModel>> OnReceiveLevelDataEventHadler;
private void DisSenderToDisWay(FarmerCardOrRateSellModel farmerCardOrRateSellModel)
{
DevTypeEnum devTypeEnum = (DevTypeEnum)farmerCardOrRateSellModel.Sender;
switch (devTypeEnum)
{
case DevTypeEnum.CardDev:
if (OnReceiveCardDataEventHadler!=null)
{
OnReceiveCardDataEventHadler(this,new FlowDataEventArgs<FarmerCardOrRateSellModel>(farmerCardOrRateSellModel));
}
break;
case DevTypeEnum.LevelDev:
if (OnReceiveLevelDataEventHadler!=null)
{
OnReceiveLevelDataEventHadler(this, new FlowDataEventArgs<FarmerCardOrRateSellModel>(farmerCardOrRateSellModel));
}
break;
default:
Logger.GetInstance().Warn("无法识别的发送者");
break;
}
}
//我们要写两个方法 ,这两个方法就是Sender为LevelDev 和CardDev,他们拿到数据自己需要怎么处理的方法了
//当sender为CardDev要执行的方法
public class CardDev{
public void CardDevWay(object sender, FlowDataEventArgs<FarmerCardOrRateSellModel> e){
var data=e.Data; //data就为传送过来的FarmerCardOrRateSellModel对象
}
}
//当sender为LevelDev 要执行的方法
public class LevelDev{
public void LevelDevWay(object sender, FlowDataEventArgs<FarmerCardOrRateSellModel> e){
var data=e.Data; //data就为传送过来的FarmerCardOrRateSellModel对象
}
}
//写到这里 我们已经把各自内部的方法完成了,现在我们要完成的就是 ,如何将方法与方法直接串联起来,怎么让sender为CardDev时就进入对应的CardDevWay方法南。那么现在就是要挂总线了。
还记的我们在总线类里面写的方法么:
现在我们要在里面添加一些代码了。
public class FlowServiceBus
{
static FlowServiceBus _flowServiceBus;
public static FlowServiceBus Instance
{
get
{
if (_flowServiceBus == null) _flowServiceBus = new FlowServiceBus();
return _flowServiceBus;
}
}
//新建对象
private readonly DisSenderToDisWay _disSenderToDisWay=new DisSenderToDisWay();
private readonly CardDev _cardDev=new CardDev ();
private readonly LevelDev _levelDev=new LevelDev ();
public void ConfigMsgDispachRule(){
EventBroker eventBroker =new EventBroker();
eventBroker.SpecialCasesRegistrar.AddPublication("发送者为CardDev 的方法", _disSenderToDisWay,
"OnReceiveCardDataEventHadler", HandlerRestriction.None);
eventBroker.SpecialCasesRegistrar.AddSubscription<FlowDataEventArgs<FarmerCardOrRateSellModel>>("发送者为CardDev 的方法",
_cardDev, _cardDev.CardDevWay, new OnPublisher());
//这是一组对应的 可以这样理解 :当执行到DisSenderToDisWay 类里面的OnReceiveCardDataEventHadler事件时,就执行CardDev 里面的CardDevWay方法
//按照以上的里面 当我们执行DisSenderToDisWay 类里面的OnReceiveLevelDataEventHadler事件时,接下来我们应该执行LevelDev类里面的LevelDevWay方法南
eventBroker.SpecialCasesRegistrar.AddPublication("发送者为LevelDev 的方法", _disSenderToDisWay,
"OnReceiveLevelDataEventHadler", HandlerRestriction.None);
eventBroker.SpecialCasesRegistrar.AddSubscription<FlowDataEventArgs<FarmerCardOrRateSellModel>>("发送者为LevelDev 的方法",
_levelDev, _levelDev.LevelDevWay, new OnPublisher());
}
}
总线这个要慢慢理解,刚开始我也不知道如何将两个方法挂接起来的,慢慢的理解就行了。在平常代码中我们很少使用总线,但是对于有些公司可能还是经常会用到的,对于那些刚刚接触到总线的朋友们,希望对你们初步理解与简单使用有帮助。
EventBus总线讲解的更多相关文章
- EventBus实现activity跟fragment交互数据
最近老是听到技术群里面有人提出需求,activity跟fragment交互数据,或者从一个activity跳转到另外一个activity的fragment,所以我给大家介绍一个开源项目,EventBu ...
- Guava中EventBus分析
EventBus 1. 什么是EventBus 总线(Bus)一般指计算机各种功能部件之间传送信息的公共通信干线,而EventBus则是事件源(publisher)向订阅方(subscriber)发送 ...
- 了解PCI Express的Posted传输与Non-Posted传输
0.写在前面 本文首发于公众号[两猿社],后续将在公众号内持续更新~ 其实算下来接触PCIe很久了,但是由于之前换工作,一直没有系统的学习和练手项目,现在新项目买了Synopsys的PCIe IP,总 ...
- Android事件总线分发库EventBus3.0的简单讲解与实践
Android事件总线分发库EventBus的简单讲解与实践 导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Han ...
- 事物总线模式实例——EventBus实例详解
事件总线模式是一种广泛运用于安卓开发之中的一种软件架构模式,而事件总线模式在安卓开发中最广泛的应用莫过于AndroidStudio提供的EventBus,所以我就EventBus来谈谈对事件总线模式的 ...
- Guava - EventBus(事件总线)
Guava在guava-libraries中为我们提供了事件总线EventBus库,它是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计 ...
- Android学习系列(43)--使用事件总线框架EventBus和Otto
事件总线框架 针对事件提供统一订阅,发布以达到组件间通信的解决方案. 原理 观察者模式. EventBus和Otto 先看EventBus的官方定义: Android optimized event ...
- 【Android】事件总线(解耦组件) EventBus 详解
当Android项目越来越庞大的时候,应用的各个部件之间的通信变得越来越复杂,例如:当某一条件发生时,应用中有几个部件对这个消息感兴趣,那么我们通常采用的就是观察者模式,使用观察者模式有一个弊病就是部 ...
- Guava: 事件总线EventBus
EventBus 直译过来就是事件总线,它使用发布订阅模式支持组件之间的通信,不需要显式地注册回调,比观察者模式更灵活,可用于替换Java中传统的事件监听模式,EventBus的作用就是解耦,它不是通 ...
随机推荐
- 读书笔记:《HTML5开发手册》--HTML5新的结构元素
读书笔记:<HTML5开发手册> (HTML5 Developer's CookBook) 虽然从事前端开发已有很长一段时间,对HTML5标签也有使用,但在语义化上面理解还不够清晰.之前在 ...
- Android指纹解锁
Android6.0及以上系统支持指纹识别解锁功能:项目中用到,特此抽离出来,备忘. 功能是这样的:在用户将app切换到后台运行(超过一定的时长,比方说30秒),再进入程序中的时候就会弹出指纹识别的界 ...
- .NET基础拾遗(5)多线程开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- 我理解的MVC
前言 前一阶段对MVC模式及其衍生模式做了一番比较深入的研究和实践,这篇文章也算是一个阶段性的回顾和总结. 经典MVC模式 经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的 ...
- 烂泥:VMWare Workation双网卡配置IP地址
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 前几天给一个客户做远程项目实施,客户那边的服务器是Windows OS的,我们这边的业务 ...
- VisualStudio 2015 开启IIS Express可以调试X64项目
现在项目开发时总有时需要在X64下开发,这样我们就需要IIS Express中调试.不要总是放在IIS中,在Attach这样好慢. 如果不设置直接调试X64的程序,我们有可能会受到以下类似的错误 ...
- 借助 SIMD 数据布局模板和数据预处理提高 SIMD 在动画中的使用效率
原文链接 简介 为发挥 SIMD1 的最大作用,除了对其进行矢量化处理2外,我们还需作出其他努力.可以尝试为循环添加 #pragma omp simd3,查看编译器是否成功进行矢量化,如果性能有所提升 ...
- Spring MVC数据校验
在web应用程序中,为了防止客户端传来的数据引发程序异常,常常需要对 数据进行验证.输入验证分为客户端验证与服务器端验证.客户端验证主要通过JavaScript脚本进行,而服务器端验证则主要通过Jav ...
- 机器指令翻译成 JavaScript —— 终极目标
上一篇,我们顺利将 6502 指令翻译成 C 代码,并演示了一个案例. 现在,我们来完成最后的目标 -- 转换成 JavaScript. 中间码输出 我们之所以选择 C,就是为了使用 LLVM.现在来 ...
- raspberrypi(树莓派)上安装mono和jexus,运行asp.net程序
参考网址: http://www.linuxdot.net/ http://www.cnblogs.com/mayswind/p/3279380.html http://www.raspberrypi ...