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的作用就是解耦,它不是通 ...
随机推荐
- Java多线程基础——对象及变量并发访问
在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...
- SQLSERVER聚集索引与非聚集索引的再次研究(上)
SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...
- Struts2实现ajax的两种方式
基于Struts2框架下实现Ajax有两种方式,第一种是原声的方式,另外一种是struts2自带的一个插件. js部分调用方式是一样的: JS代码: function testAjax() { var ...
- 强强联合,Testin云测&云层天咨众测学院开课了!
Testin&云层天咨众测学院开课了! 共享经济时代,测试如何赶上大潮,利用碎片时间给女票或者自己赚点化妆品钱? 2016年12月13日,Testin联手云层天咨带领大家一起推开众测的大门 ...
- C# 对象实例化 用json保存 泛型类 可以很方便的保存程序设置
参考页面: http://www.yuanjiaocheng.net/webapi/test-webapi.html http://www.yuanjiaocheng.net/webapi/web-a ...
- Javascript 严格模式详解
转自http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html 一.概述 除了正常运行模式,ECMAscript 5添加了第二 ...
- 关于CSS inline-block、BFC以及外边距合并的几个小问题
CSS inline-block和BCF对于初学者来说,总是弄不太明白,下面记录下我在学习这块知识的过程中遇到的几个问题,供大家参考,有不足的地方,欢迎大家批评指正. 一.在什么场景下会出现外边距合并 ...
- (转)从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
原文地址: http://www.cnblogs.com/lyhabc/p/4682028.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第二篇,主要讲述如何搭建故障转移集 ...
- “前.NET Core时代”如何实现跨平台代码重用 ——源文件重用
微软在2002年推出了第一个版本的 .NET Framework,这是一个主要面向Windows 桌面(Windows Forms)和服务器(ASP.NET Web Forms)的基础框架.在此之后, ...
- Android开发学习之路-机器学习库(图像识别)、百度翻译
对于机器学习也不是了解的很深入,今天无意中在GitHub看到一个star的比较多的库,就用着试一试,效果也还行.比是可能比不上TensorFlow的,但是在Android上用起来比较简单,毕竟Tens ...