浅谈基于插件的软件框架(2)

    上篇文章中主要介绍了插件的一些概念性问题,这里主要介绍本人设计的一个基于MFC的插件框架,该框架要求的插件均以动态链接库(dll)的方式存在。

    框架结构

     该框架在总体结构上可以分为三层:集成框架、插件管理层、插件层。结构如下图所示:

 

    

    一.集成框架

     集成框架提供软件运行的基本界面,包括主界面、菜单栏、工具栏、状态栏等。该框架中的菜单栏、工具栏中的内容均由一个叫“ui.xml”文件动态生成。“ui.xml”界面配置文件中定义了特定软件的菜单栏,工具栏信息。集成框架的具体任务这里先不做详细说明(后续文章中会对其进行描述),该文章中主要介绍一下框架如何实现对插件的管理。

    二.插件管理层

      插件管理层是整个插件框架的核心。主要实现对插件的管理、服务的管理及提供一个插件间通信的通用平台。

     1.插件的管理

      插件的管理包括插件的加载、卸载和查询等功能。

     (1)插件的加载。

      插件的加载分为两种,自动加载和手动加载。其中自动加载发生在软件初始化时,插件管理器自动读取一个名为        “plugin.xml”的插件配置文件(该文件中定义了要加载的插件的名称及版本信息),并在默认路径下搜索并加载;手动加载发生在软件运行之后,用户通过打开插件管理对话框实现对插件的手动加载。

      (2)插件的卸载。

      插件的卸载也分两种,自动卸载和手动卸载。其中自动卸载发生在软件关闭时,插件管理器依次卸载所有的插件;手动卸载发生在软件运行过程中,若用户不需要某个模块的功能时,可以通过插件管理对话框实现对插件的手动卸载。

      (3)插件的查询。

      提供插件信息的查询功能。

      2.服务的管理

       首先介绍一个该框架中服务的概念,这里服务与我们所熟知的后台服务程序是两码事。该框架中服务定义很广泛,可以使数据结构、可以是类指针,甚至可以是某个变量地址,函数地址等,总之,任何类型的数据都可以当做一种服务。每种服务对应一个服务ID,与相应的服务进行绑定。

      为什么需要服务管理器这一模块?很多时候,我们的插件之间可能要共享或访问同一数据,为了方便各个插件对同一数据访问,那么必须将这些数据在各个插件间共享,服务管理器做的就是这件事。

      (4)为插件与插件间的通信提供一个通用平台。

      我们知道一个软件内部各个功能模块(插件)之间不可能是完全独立的,插件和插件间或多或少总会存在一些接口调用。可是,一个插件甚至不知道被调用插件的类型,也不知道被调用插件的地址(加载进来之后),那么如何实现两个完全独立的插件间的相互调用呢?很简单,因为插件管理器知道。插件管理器维护了一个所有加载进来的插件列表,同时插件管理器提供了一个插件指针查询的接口,各个插件内部维护了一个插件管理器指针,通过这个指针可以实现对插件的查询。

      如何获取正确的插件的指针呢?该插件框架规范中规定为每个插件定义一个唯一的ID(当然这个ID需要暴露给其他插件)。通过这个唯一ID可以找到对应的插件指针。这个指针的类型并不是被调用插件的具体类型(因为一个插件不可能知道其他插件的具体类型),而是一个基类的指针,该基类是一个抽象接口,由各个插件共用,如何实现功能调用将在后续的文章里面介绍。

      待续。。。

    

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值