C语言[连载]《C#通信(串口和网络)框架的规划与完成》- 7.表面接口的统一筹划

7.3    数据导出接口

   
在数码集成系统项目中,要么是融为一炉其余厂家的装备数量,要么是此外厂家集成本人家的设施数据,在平素不统一的科班前提下,会有各个集成数据的格式。为了满足此类的情景,为设备导出数据专门设计了接口,开发者能够继承该接口,设备在拍卖完数据后,会把多少自动传输到该接口,能够按规定的多寡格式实行输出了。

     对配备驱动实时数据导出,能够把一类的配备数量导出成各类数目格式。

    
导出多少插件能够通过铺排文件实行加载,只要设备驱动有多少更新,就把数据通过事件传递给导出数据接口。不在配置文件中布置插件消息,则程序不实行加载,不实行导出操作。所以,那种事务性的劳务不需求界面来完结,能够在宿主程序运营时通过代码来成功。

    IExportData数据导出接口代码定义如下:

public interface IExportData:IPlugins
{
       /// <summary>
       /// 格式化数据
       /// </summary>
       /// <param name="devid"></param>
       /// <param name="obj"></param>
       /// <returns></returns>
       object FormatDataString(int devid, object obj, DeviceType devicetype);
}

7.6    框架整合、重构

   
总的来说,框架平台涉及到八个关键的接口:IRunDevice设备驱动接口、IGraphicsShow图形展现接口、IExportData数据导出接口和IAppService服务组件接口。它们以后的后续结构关系如下图:

C语言 1 

骨子里继承那多个接口1遍开发的模块都以以插件的情势加载到框架平台,框架平台在结构上落成了一整套的运行机制。对地方的后续关系结构图举行剖析,还有整合、重构的余地,进一步明晰接口关系、整合代码,提升框架的可扩张性,陈设重构后的接口继承关系如下图:

C语言 2 

    
全部可扩展的接口都无冕自一个插件接口,再分支出来其余的业务成效接口,类似于C#言语中负有实体都一连自Object一样。

7.2    图形展现接口

   
框架平台通信设备驱动把多少收集上来的只是本来数据,经过处理后要形成工作数据,那么就会有显示、分析、查询、打字与印刷、报表等事务职能,并且针对同一的多少音讯,不相同的用户供给处理的法门有非常大的两样。那有的效果改变十分大,可是又不能够每一回有改动就要去修改框架平台,因为框架是“稳定”的某些,形成版本控制后就不随便更改了。

  
基于那样考虑,作为框架要提供一个建制,能够加载二次开发者设计的UI窗体。用于展现采集终端设备的多寡,能够把不一样档次设备的数据以种种方式集成彰显在区别界面上。方便为用户提供各类的、更友善的人机交互界面。

  
首先,框架平台不能够在开发银行的时候就显得全部UI窗体,具体要展现哪个UI窗体完全由用户本身决定,所以,大家要通过计划文件的款式把1次开发的零件新闻加载到菜单里,提供可触及的来得事件入口,如下图:

C语言 3 

   其次,那么以什么的款型展现窗体呢?像许多管理系列一样,我们选用Form
Tab的艺术体现,如下图:

 C语言 4

  
UI部分的规划就这么了,可是从事情角度我们要考虑两件事:(1)在一回开发的窗体上单击鼠标右键事件时要显示相应设备的上下文菜单,也正是说要调用IRunDevice设备驱动的ShowContextMenu函数,要在IGraphicsShow接口中提供MouseRightContextMenuHandler事件,以使得调用ShowContextMenu函数字显示示上下文菜单。(2)当单击菜单项的时候,会以Tab的花样展示窗体,不过当数次单击后是不能够屡屡显示UI窗体的,所以要有二个管理器(GraphicsShowController),通过接口的ThisKey属性判断当前来得的UI窗体是还是不是存在,借使不设有,那么就体现该UI窗体,不然退出操作;既然有贰个管理器,当关闭窗体的时候,供给把该UI窗体实例从管理器中除去掉,制止不能够再度突显窗体,因为它一直留存于管理器中。所以还必要在接口中定义3个关门窗体的风浪GraphicsShowClosedHandler,释放窗体财富后从管理器中去除实例。

   至此,自定义窗体显示部分就安排完结了,IGraphicsShow接口定义代码如下:

public interface IGraphicsShow : IPlugins
{
       /// <summary>
       ///    关闭窗体事件时发生
       /// </summary>
       event GraphicsShowClosedHandler GraphicsShowClosedHandler;

       /// <summary>
       ///     单击右键
       /// </summary>
       event MouseRightContextMenuHandler MouseRightContextMenuHandler;
}

第拾章     外部接口的筹划

开发者不仅可以3次开发设备驱动,还足以三回开发自定义图形展现格局、

自定义数据导出格式和三种事情服务,并且配备驱动接口与那三种接口进行事件响应和数目交互。

7.5    插件管理器

   
图形展现接口、数据导出接口和劳动组件接口都分别有两个接口管理器,负责对各职能接口实行管制,它们都持续自IBaseManager<TKey,
电视机alue>接口。继承关系图如下:

 C语言 5

7.7           小结… 10

7.2           图形呈现接口… 3

7.4    服务组件接口

    
围绕着设备驱动模块采集的数量,依照应用场、须要,能够提供两种应用服务,例如:数据转载服务、4-20mA服务、短信服务、LED服务、OPC服务、以及错综复杂的实时数据解析服务等。在保持数据实时性、稳定性的前提下,服务接口能够提供联合的劳动体制,方便开发者实行3遍开发。

    
服务插件的服务措施,那种服务是遥远运转的事务性职分,所以更复杂一些。

   
有个别服务须求随宿主程序运转而自动运维,有个别服务要求人工手动运营才运转。在宿主程序运行的时候经过配制文件要把劳动的音信加载到菜单上,菜单里显示的服务只怕有点早就运转了;有个别须求经过单击操作,展现窗体并填写要求的消息后才可能运维。所以,宿主程序与劳务插件不是单向交互,而是双向数据、事件交互。

   
IappService服务接口在IPlugins基础上实行扩张,扩大了函数、属性和事件,代码定义如下:

public interface IAppService : IPlugins
{
        /// <summary>
       ///     启动服务
       /// </summary>
       void StartService();

       /// <summary>
       ///     是否自动启动
       /// </summary>
       bool IsAutoStart { set; get; }

         /// <summary>
       ///     服务类型
       /// </summary>
       ServiceType ServiceType { set; get; }

       /// <summary>
       ///     单击事件,关联菜单
       /// </summary>
       void OnClick();

       /// <summary>
       ///     释放服务
       /// </summary>
       void ReleaseService();

       /// <summary>
       ///     写日志事件
       /// </summary>
       event WriteLogHandler WriteLogHandler;
}

(1)   
StartService函数:当服务的起步格局(IsAutoStart)为”自动运行”的时候,框架平台在加载服务的时候,会自行调用这几个接口函数,表示对劳动进行运维操作。

(2)   
IsAutoStart属性:服务运转项目,标识是还是不是随框架平台运行而活动运营,也正是标识是不是会调用StartService接口函数。

(3)   
ServiceType属性:服务类型分为:呈现方式和隐藏情势。显示情势的服务会在框架平台的食谱上加载以ThisName标识的服务名称;隐藏情势不会在框架平台的菜谱中加载服务名称,能够把该类服务的IsAutoStart属性设置为全自动运行,框架平台运行后自行运维服务。代码定义如下:

public enum ServiceType
{
    [EnumDescription("显示模式")]
    Show = 0x00,
    [EnumDescription("隐藏模式")]
    Hide = 0x01
}

(4)   
OnClick事件函数:当服务类型ServiceType为“彰显形式“的时候,服务名称会被加载到菜单中,当单击服务菜单项的时候,会调用相应服务的OnClick接口函数,能够在那个接口函数里调用窗体。

(5)   
ReleaseService函数:当关闭框架平台和人造手动截止服务后,能够经过这几个函数释放服务财富。

 其它,对于服务组件接口还关乎到劳动场地,标识服务在运作的历程中处

于如何阶段,例如:服务正在运维、服务业已起步、服务正在运维、服务正在终止、服务已经结束等等。因为依照劳动的事情复杂度分裂,服务的事态也说不定两样,所以服务场馆包车型地铁定义交给了1遍开发者本身定义。

7.1           插件接口… 2

7.4           服务组件接口… 6

7.5           插件管理器… 8

7.1    插件接口

   
图形展现接口、数据导出接口和劳动组件接口都一连自统一的插件接口(IPlugins),首假如方便管理和扩展。插件接口的代码定义如下:

public interface IPlugins : IDisposable
{
       /// <summary>
       /// 服务Key,要求唯一
       /// </summary>
       string ThisKey { get; }

       /// <summary>
       /// 服务名称
       /// </summary>
       string ThisName { get; }

       /// <summary>
       /// 更新设备数据,用于接收来自设备驱动的数据信息
       /// </summary>
       /// <param name="devid">设备ID</param>
       /// <param name="obj">设备对象</param>
       void UpdateDevice(int devid, object obj);

       /// <summary>
       /// 移除设备,当框架平台删除设备的时候进行响应。
       /// </summary>
       /// <param name="devid">设备ID</param>
       void RemoveDevice(int devid);
}

    
图形展现接口、数据导出接口和劳动组件接口与插件接口的延续关系如下图:

C语言 6 

    
设备驱动只要有更新数据就会通过事件把多少传送到UpdateDevice接口里,那些接口内部到底怎么处理完全由一次开发者来控制。当接触设备驱动的删除事件,就会调用RemoveDevice接口,以删除、释放能源。

7.3           数据导出接口… 5

第十章           外部接口的设计… 2

7.6           框架整合、重构… 9

目       录

7.7    小结

   
框架之中实际上是对接口实行直接调用,接口与接口之间的合作又完结了一套协调机制,从而稳步实现了三个框架平台。作为接口实际上是落到实处了三次开发与框架平台对接的一种样式,并确认保证在框架平台的和谐机制中完结特定的事体功用。所以,任何框架,从顶层来看都以对接口的安排。

 

作者:唯笑志在

mail:504547114@qq.com

QQ:504547114

.NET开发技术联盟:54256083

文书档案下载:http://pan.baidu.com/s/1pJ7lZWf

法定网址:http://www.bmpj.net