1.插件的设计
前面说过,插件本质上讲其实就是一些功能模块,只是在该框架中,他们均已独立的dll形式存在。每个插件对应的功能可能完全不一样,提供的接口也可能完全不一样,插件管理器如何实现对所有插件的统一管理呢了解决这个问题,我们定义了一个基类,该基类是一个抽象类,所有的插件都必须继承与一个公共的插件基类。插件基类作为所有插件的公共基类,必须定义一些通用的接口。这里主要介绍4个通用的接口:
(1)插件的初始化接口:该接口为每个插件提供的插件管理器的接口指针,插件的初始化接口由插件自己根据实际情况做一些初始化的工作。该接口由插件管理器在所有插件都加载完后统一调用。
(2)插件功能调用接口:该接口为插件的功能调用的入口,该接口接受一个功能ID(每个插件必须为其提供给外部的所有功能定义唯一的ID)及可变长参数,所有输出参数都需以指针的方式传递。
(3)插件停止工作接口:该接口需停止插件的所有正在运行的工作(主要针对多线程)。
(4)插件的释放接口:插件在卸载时调用,主要用于释放插件自己的内存。该接口也有插件管理器统一调用。
所有的插件都必须继承插件基类,并且根据实际情况实现以上的4个接口。
2.插件间的数据交互
插件和插件不可能是完全独立的,很多时候插件间会存在一些数据交互,如何实现这些交互呢/p>
数据交互方式有两种:通过接口(功能调用接口)交互和服务的方式。
(1)通过接口(功能调用接口)交互
从插件基类的设计我们可以看到,初始化接口中插件管理器将自己传给了每个插件(当然插件管理器不可能将其所有的功能都暴露给插件,那样插件的权限太大了,没必要,而且很不安全),传递过来的插件管理器指针并不是真正的插件管理器,而是插件管理器的基类,这个基类提供了插件间的通信所必须的所有接口。简要介绍下几个重要的接口:
a.插件的查询接口:该接口根据插件的ID和flag返回一个插件基类的指针。
b.服务的插件接口:该接口在后面讲。
假如某个插件要访问其他插件的功能,那么首先通过插件的查询接口获取插件指针,然后通过插件的功能调用接口完成功能的调用。
(2)服务的方式
在有些情况下,某个插件提供的数据可能需要被其他多个插件进行访问,如果通过功能调用接口进行访问,显然比较麻烦,如何解决该问题务管理器可以,插件可以将一些数据作为服务放入服务管理器的服务中(每个服务必须有一个全局唯一的服务ID,这些服务数据的安全性这里暂不描述),其他插件则根据服务ID查询相关的数据。
以上的描述都是以最简洁的方式阐述,下文中将描述继承框架做的事。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!