从0到1构建自己的插件系统--序篇

从0到1构建自己的插件系统–序篇

从今天起、我们谈谈如何构建自己简单易用的插件系统,让我们的系统瞬间变的高大上,让自己的架构能力上一个档次。

不纳入插件系统,有什么危害

  • 需求的不断变化,导致系统越来越臃肿,扩展不方便
  • 一旦对软件产品进行功能更新,会导致一系列的变化,导致研发成本特别高,需要对整个系统进行测试

常用插件系统与自制系统对比

  • Qt 是一个跨平台的C++的图形界面库,整个生态很完整,类似于Boost,提供了几十个模块(基础STL库、绘制、3D、网路、多媒体、协程、多进程、NFC、数据库、脚本等),里面内置了一套插件技术,但好像没有完整的一套插件系统。
  • Com组件 是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下;COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块。
    | 功能简单对比 | QT | Com组件 | 自主插件系统 |
    | — | — | — | — |
    | 跨平台 | 是 | 否 | 是 |
    | 轻量级 | 否(QT的整个库比较大) | 否 | 是 |
    | 是否有完整插件系统 | 否 | 否 | 是 |
    | 多语言 | 否 | 是(C#、JAVA、网页中调用) | 是 |
    | 使用难度 | 容易 | 难(系统安装还需要注册) | 容易 |
    | 内置界面框架 | 是 | 是 | 否(需要借助其他) |

插件系统的构成

  • 主系统 使用插件管理器加载插件、创建插件对象,之后的插件对象可以像常规对象一样创建了。
  • 插件管理器 负责插件的加载、初始化、卸载并暴露到主系统中,也提供所有注册对象的获取、迭代以及获取对象的注册信息等。
  • 插件 根据插件系统的规范实现各种接口类(这个规范包括类继承、类注册、DLL初始化等)

从0到1构建自己的插件系统--序篇

自主插件系统的特点

  • 跨平台(使用平台无关SDK,包括文件操作、动态库加载)
  • 跨语言使用(编写的插件系统,可以在多个语言使用)
  • 跨语言插件(插件的编写可以支持非C++语言,如C#、JAVA)
  • 提供简单易用的STL库(包括文件系统、动态库、正则表达式、Varint可注册类型、日期时间类、Xml与json操作等)
  • 延迟加载(自动根据系统的情况动态加载所需要的插件)
  • 高效(百万类的创建只要100ms)
  • 扩展的SWIG

程序流程

从0到1构建自己的插件系统--序篇

主程序通过插件管理器读取所有插件的配置信息(对于第一次启动,会自动创建配置信息,主要解决延迟加载问题),根据一定的规则(可以是插件的命名规范,也可以是程序内部的特定函数)来加载所需要的插件,查找某个特定的函数(dllinit)来获取所有的类信息,通过整理插件内的类信息建立高效的类创建函数指针与类名的对应关系(方便后面创建实例化对象)

从0到1构建自己的插件系统--序篇