在我们公司经常用到总线,具体的总线是什么让我理解我也不清楚,但是在这几个月下来,我已经知道总线如何使用,现在加上示例讲解总线如何使用。

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总线讲解的更多相关文章

  1. EventBus实现activity跟fragment交互数据

    最近老是听到技术群里面有人提出需求,activity跟fragment交互数据,或者从一个activity跳转到另外一个activity的fragment,所以我给大家介绍一个开源项目,EventBu ...

  2. Guava中EventBus分析

    EventBus 1. 什么是EventBus 总线(Bus)一般指计算机各种功能部件之间传送信息的公共通信干线,而EventBus则是事件源(publisher)向订阅方(subscriber)发送 ...

  3. 了解PCI Express的Posted传输与Non-Posted传输

    0.写在前面 本文首发于公众号[两猿社],后续将在公众号内持续更新~ 其实算下来接触PCIe很久了,但是由于之前换工作,一直没有系统的学习和练手项目,现在新项目买了Synopsys的PCIe IP,总 ...

  4. Android事件总线分发库EventBus3.0的简单讲解与实践

    Android事件总线分发库EventBus的简单讲解与实践 导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Han ...

  5. 事物总线模式实例——EventBus实例详解

    事件总线模式是一种广泛运用于安卓开发之中的一种软件架构模式,而事件总线模式在安卓开发中最广泛的应用莫过于AndroidStudio提供的EventBus,所以我就EventBus来谈谈对事件总线模式的 ...

  6. Guava - EventBus(事件总线)

    Guava在guava-libraries中为我们提供了事件总线EventBus库,它是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计 ...

  7. Android学习系列(43)--使用事件总线框架EventBus和Otto

    事件总线框架 针对事件提供统一订阅,发布以达到组件间通信的解决方案. 原理 观察者模式. EventBus和Otto 先看EventBus的官方定义: Android optimized event ...

  8. 【Android】事件总线(解耦组件) EventBus 详解

    当Android项目越来越庞大的时候,应用的各个部件之间的通信变得越来越复杂,例如:当某一条件发生时,应用中有几个部件对这个消息感兴趣,那么我们通常采用的就是观察者模式,使用观察者模式有一个弊病就是部 ...

  9. Guava: 事件总线EventBus

    EventBus 直译过来就是事件总线,它使用发布订阅模式支持组件之间的通信,不需要显式地注册回调,比观察者模式更灵活,可用于替换Java中传统的事件监听模式,EventBus的作用就是解耦,它不是通 ...

随机推荐

  1. 阿里云直播 C# SDK 如何使用

    阿里云直播SDK的坑 1.直播云没有单独的SDK,直播部分被封装在CDN的相关SDK当中. 2.针对SDK,没有相关Demo. 3.针对SDK,没有相关的文档说明. 4.针对SDK的说明,官网上的说明 ...

  2. 初步了解nodejs

    什么是Node.js? 很多初学者并没有真正地理解Node.js到底是什么.nodejs.org网站中的描述也没有多大帮助. 首先要清楚Node不是一个Web服务器,这十分重要.它本身并不能做任何事情 ...

  3. 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法

    若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...

  4. Anders Hejlsberg 技术理想架构开发传奇

    Anders Hejlsberg(安德斯-海森博格) 坐在自己的办公室,双眼直直的盯着前方.他要做一个决定,决定自己未来的命运和理想.这是1996年一个普通的下午,几个小时前,他刚与比尔-盖茨结束了 ...

  5. 【干货分享】流程DEMO-制度发文和干部任免

    流程名: 制度发文和干部任免  业务描述: 当员工在该出勤的工作日出勤但漏打卡时,于一周内填写补打卡申请.  流程相关文件: 流程包.xml  流程说明: 直接导入流程包文件,即可使用本流程  表单: ...

  6. 品牌营销:不要Beat,要逼格!

             品牌营销:不要Beat,要逼格! 奥美的创始人大卫·奥格威说,广告营销应当是"具有风度的推销产品".而当下的营销手段,"风度"早已被抛之脑后, ...

  7. Android Retrofit 2.0 使用-补充篇

    推荐阅读,猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava 4.RxBus 5.Android MVP+Retrofit+RxJava实践小 ...

  8. SqlServer简单数据分页

    手边开发的后端项目一直以来都用的.NET MVC框架,访问数据库使用其自带的EF CodeFirst模式,写存储过程的能力都快退化了 闲来无事,自己写了条分页存储过程,网上类似的文章多的是,这里只列了 ...

  9. crontab介绍

    1.Cron的启动与关闭 由于Cron是Linux的内置服务,可以用以下的方法启动.关闭这个服务: /sbin/service crond start           //启动服务/sbin/se ...

  10. Linux 入门之网络配置

    查看网络状态 ifconfig 修改网络参数 实验环境centos6.5,其他系统自行百度 ls /etc/sysconfig/network-scripts 显示所有文件, vi /etc/sysc ...