[连载]《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,
电视alue>接口。继承关系图如下:

 军事联盟 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

admin

网站地图xml地图