[连载]《C#通讯(串口和网)框架的筹划及落实》- 7.外部接口的统筹

目       录

第七章节           外部接口的设计… 2

7.1           插件接口… 2

7.2           图形显示接口… 3

7.3           数据导出接口… 5

7.4           服务组件接口… 6

7.5           插件管理器… 8

7.6           框架整合、重构… 9

7.7           小结… 10

第七章     外部接口的统筹

开发者不仅可以二次开发设备驱动,还可二次开发自定义图形显示形式、

自打定义数据导出格式和多种工作服务,并且配备驱动接口及当时三栽接口进行事件响应与数码交互。

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);
}

    
图形显示接口、数据导出接口和劳动组件接口及插件接口的继续关系如果下图:

图片 1 

    
设备驱动只要发生更新数据就见面通过波将多少传送到UpdateDevice接口里,这个接口内部到底怎么处理了出于二次开发者来控制。当接触设备驱动之去除事件,就会见调用RemoveDevice接口,以删、释放资源。

7.2    图形显示接口

   
框架平台通讯设备驱动把数量搜集上的才是原本数据,经过处理后如形成工作数据,那么尽管会见来显、分析、查询、打印、报表等业务职能,并且对同的数量信息,不同之用户要求处理的计发生老十分之两样。这部分职能改变异常要命,但是又未可知每次发改就要去窜框架平台,因为框架是“稳定”的一对,形成版本控制后就是无随便更改了。

  
基于这样考虑,作为框架而供一个体制,能够加载二次开发者设计之UI窗体。用于展示采集终端设备的数码,可以拿不同门类设备的多少以多种形式集成显示在不同界面上。方便也用户提供多底、更融洽之人机交互界面。

  
首先,框架平台不克当启动的下便亮所有UI窗体,具体要显谁UI窗体完全是因为用户自己主宰,所以,我们如果透过配备文件之款式拿二次开发的机件信息加载到菜单里,提供可点的示事件入口,如下图:

图片 2 

   其次,那么为安的样式展示窗体呢?像许多管理体系一样,我们采取Form
Tab的法展示,如下图:

 图片 3

  
UI部分的宏图虽这么了,但是自从作业角度我们如果考虑少件事:(1)在二次开发的窗体上单击鼠标右键事件不时如展示相应设施的上下文菜单,也就是说要调用IRunDevice设备驱动的ShowContextMenu函数,要在IGraphicsShow接口中提供MouseRightContextMenuHandler事件,以令调用ShowContextMenu函数显示上下文菜单。(2)当单击菜单项的时,会坐Tab的花样展示窗体,但是当数单击后是免克反复显示UI窗体的,所以若发一个管理器(GraphicsShowController),通过接口的ThisKey属性判断当前形的UI窗体是否留存,如果不设有,那么即便显示该UI窗体,否则退出操作;既然发生一个管理器,当关闭窗体的下,需要将该UI窗体实例从管理器中删除掉,避免无法还展示窗体,因为它直接有让管理器中。所以还待在接口中定义一个关闭窗体的轩然大波GraphicsShowClosedHandler,释放窗体资源后自管理器中剔除实例。

   至此,自定义窗体显示有即使计划完毕了,IGraphicsShow接口定义代码如下:

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

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

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.4    服务组件接口

    
围绕在设备驱动模块采集的多少,根据应用场、需求,可以供多种应用服务,例如:数据转发服务、4-20mA服务、短信服务、LED服务、OPC服务、以及错综复杂的实时数据解析服务等。在保障数据实时性、稳定性的前提下,服务接口可以供合之劳务体制,方便开发者进行二次开发。

    
服务插件的劳动方式,这种服务是长期运行的事务性任务,所以再次复杂一些。

   
有些服务得随宿主程序启动而自动运行,有些服务需人工手动启动才运行。在宿主程序启动之当儿经过配制文件要将劳务之音加载到菜单上,菜单里展示的服务或者略已经起步了;有些要通过单击操作,显示窗体并填写必要之音后才可能启动。所以,宿主程序与劳务插件不是独自为交互,而是双向数据、事件交互。

   
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函数:当关闭框架平台及人为手动停止服务后,可以由此是函数释放服务资源。

 另外,对于服务组件接口还涉嫌到劳动状态,标识服务在运转的过程被处于

给什么阶段,例如:服务着起步、服务都启动、服务正在运作、服务在止、服务业已告一段落等等。因为根据劳动的业务复杂度不同,服务之状态为恐怕不同,所以服务状态的概念交给了二次开发者友好定义。

7.5    插件管理器

   
图形显示接口、数据导出接口及服务组件接口都各自发生一个接口管理器,负责对各职能接口进行管理,它们还蝉联自IBaseManager<TKey,
TValue>接口。继承关系图如下:

 图片 4

7.6    框架整合、重构

   
总的来说,框架平台涉及到四只根本的接口:IRunDevice设备驱动接口、IGraphicsShow图形显示接口、IExportData数据导出接口和IAppService服务组件接口。它们现在底继续结构涉及而下图:

图片 5 

骨子里继承这四个接口二次开发的模块都是以插件的款式加载到框架平台,框架平台在结构上实现了身的运行机制。对地方的连续关系结构图进行剖析,还有做、重构的后路,进一步明晰接口关系、整合代码,提高框架的可是扩展性,计划重构后底接口继承关系如果下图:

图片 6 

    
所有可扩大的接口都持续自一个插件接口,再分出其他的业务职能接口,类似于C#言语中有实体都累自Object一样。

7.7    小结

   
框架内实际上是本着接口进行直接调用,接口及接口之间的匹配而实现了同法协调机制,从而逐步实现了一个框架平台。作为接口实际上是落实了二次开发与框架平台对接的如出一辙种植样式,并包在框架平台的和谐机制被实现特定的业务功能。所以,任何框架,从顶层来拘禁还是针对接口的宏图。

 

作者:唯笑志在

mail:504547114@qq.com

QQ:504547114

.NET开发技术联盟:54256083

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

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