C#[连载]《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);
}

    
图形显示接口、数据导出接口和劳务组件接口与插件接口的持续关系如下图:

C# 1 

    
设备驱动只要有创新数据就会因此事件把数量传送到UpdateDevice接口里,那个接口内部到底怎么处理完全由二次开发者来支配。当接触设备驱动的去除事件,就会调用RemoveDevice接口,以删除、释放资源。

7.2    图形显示接口

   
框架平台通信设备驱动把多少搜集上来的只是本来数据,经过处理后要形成工作数据,那么就会有浮现、分析、查询、打印、报表等事务功用,并且针对同一的多寡音讯,区其他用户要求处理的章程有很大的不比。那有的效应转移很大,不过又不可以每便有改观就要去修改框架平台,因为框架是“稳定”的局地,形成版本控制后就不随便更改了。

  
基于那样考虑,作为框架要提供一个机制,可以加载二次开发者设计的UI窗体。用于呈现采集终端设备的数据,可以把分歧序列设备的数目以三种格局集成展现在不一样界面上。方便为用户提供八种的、更要好的人机交互界面。

  
首先,框架平台不或许在起步的时候就体现所有UI窗体,具体要显得哪个UI窗体完全由用户自个儿主宰,所以,大家要透过安排文件的款型把二次开发的机件音讯加载到菜单里,提供可触及的来得事件入口,如下图:

C# 2 

   其次,那么以什么样的款式显得窗体呢?像许多管理种类一样,大家应用Form
Tab的方法呈现,如下图:

 C# 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)   
瑟维斯Type属性:服务类型分为:彰显形式和隐身格局。显示格局的服务会在框架平台的食谱上加载以ThisName标识的劳务名称;隐藏方式不会在框架平台的菜单中加载服务名称,可以把该类服务的IsAutoStart属性设置为自行启动,框架平台启动后自行启动服务。代码定义如下:

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

(4)   
OnClick事件函数:当服务类型ServiceType为“显示情势“的时候,服务名称会被加载到菜单中,当单击服务菜单项的时候,会调用相应服务的OnClick接口函数,可以在那些接口函数里调用窗体。

(5)   
Release瑟维斯函数:当关闭框架平台和人工手动甘休服务后,可以因而这么些函数释放服务资源。

 此外,对于服务组件接口还涉嫌到劳动情况,标识服务在运作的长河中处

于怎么样阶段,例如:服务正在启动、服务一度启动、服务正在运转、服务正在终止、服务业已终止等等。因为依据劳动的工作复杂度不相同,服务的景况也大概两样,所以服务情形的定义交给了二次开发者本人定义。

7.5    插件管理器

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

 C# 4

7.6    框架整合、重构

   
总的来说,框架平台涉及到两个相当紧要的接口:IRunDevice设备驱动接口、IGraphicsShow图形突显接口、IExportData数据导出接口和IAppService服务组件接口。它们以后的后续结构涉及如下图:

C# 5 

实则继承那多个接口二次开发的模块都以以插件的方式加载到框架平台,框架平台在结构上完结了一整套的运行机制。对上边的持续关系结构图举办辨析,还有整合、重构的后路,进一步明晰接口关系、整合代码,升高框架的可增加性,安插重构后的接口继承关系如下图:

C# 6 

    
所有可增加的接口都一连自一个插件接口,再分支出来其余的事情职能接口,类似于C#言语中兼有实体都一连自Object一样。

7.7    小结

   
框架之中实际上是对接口进行直接调用,接口与接口之间的分外又落成了一套协调机制,从而逐步落到实处了一个框架平台。作为接口实际上是落到实处了二次开发与框架平台对接的一种格局,并保管在框架平台的调和机制中贯彻特定的事情职能。所以,任何框架,从顶层来看都是对接口的宏图。

 

小编:唯笑志在

mail:504547114@qq.com

QQ:504547114

.NET开发技术联盟:54256083

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

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

相关文章