关于插件的一些观点

插件,首先是一种机制,让你的程序易于扩展。但我们思考插件时,思维往往容易固化,从而限制了自己的思维。

我试图写点东西,打破这种固化的思维。

1、我这里将提供插件管理的核心称之为宿主,它应该是一种及其精简的微内核,唯一的作用就是注册和查询中心,内部维护每个插件的来源和所提供的服务就行。

2、宿主不需要知道如何去加载每个插件,插件的加载是由提供加载插件加载服务的加载器插件来完成。

3、宿主同样也不知道该如何调度每个插件,插件的调度同样是由提供调度服务的插件来完成。

4、宿主很势利,它允许有实力的插件替换掉老化的插件,也就是所谓服务的可替代性。它根据服务的优先级等参数来决定在调度器查询某项服务时给谁机会。包括调度器和加载器也是一对悲催的角色,虽然很靠近核心,但同样是可替代的插件。当然,有一个例外,宿主自己实际上也是一个调度器,但它唯一干的事就是向自己查询该用那个调度器,然后将控制权交给它。

5、插件的加载时间点考虑提供:启动时加载,启动后延迟加载,按需加载和退出前加载四种。

6、插件可以是链式服务的,也可以是单实例的。但即使是链式的,其每个节点也是要遵循可替换原则的。

7、没人规定插件必须DLL或者是BPL,即使规定了,也没人能够强制你遵守,你才是自己源码的主宰。只要实现合适的加载器插件,其他程序、脚本、网页都可以是插件,程序可以写死,但思维一定不要把自己锁死。

8、插件的注册机制的选择实际上是由加载器插件来决定的,可能从配置文件用导入,也可能直接调用插件的特定接口实现,也可能是在加载插件时,插件自己完成的。

9、如果可能,插件的加载器最好能实现插件的线上更新,而不需要退出程序。对于有些服务来说,线上更新可以实现不间断服务,这对有些环境很重要。

10、接口要有版本化的东西,这对于插件的兼容性来说更重要。一个插件可能用了旧版本的接口,如果可以兼容,提供服务的插件就可以返回老式的接口让他正常工作了。

好了,先啰嗦这么多,好的插件引擎不易编写,切用且珍惜吧

分享到: