来源: [转载]终于可以发布Delphi下收点OSGI精髓皮毛而设计的插件框架WisdomPluginFramework – 斑马猪 – 博客园
这是一个Delphi实现的插件框架,
我耗费了相当相当相当多的精力来设计她,虽然仅闪着点我微薄智慧的光芒,但我还是决定用Wisdom来命名她,
也因它是我绝无仅有的,在完成1年多后回头来看仍能相当满意的作品,
所以我补充了展示她特性的Demo和管理工具,决定将她开源发布给仍在坚持着的Delphi Fans。
我发现,人年龄越大,越害怕复杂的东西,越偏向喜欢清澈简单明了的事物,因此,这个插件框架的设计我是费尽心思地往简单上整,
务求扫上几眼几分钟就大概懂了原理,就能上手用起来;务求使用中只需遵守最少的使用守则!
为此,我把OSGI和Eclipse的插件设计精华提取提取再提取,思考思考再思考,终于得偿所愿,最终汇成了她!
好了,吹牛吹过头又吹过瘾了,就还是回到正事,介绍下这个框架都具备什么特性,有什么好处来吸引你。
1、她是微内核的设计
什么是微内核?就是核心实现小如原子,其它一切皆是插件,通过插件的相互构织构建出大千世界。
与此相对应的,那些构建了基本框架,给你一堆既定接口让你完善细处的叫巨内核设计,我讨厌学习一堆接口,因此坚决支持微内核设计,
微内核下整个实现的核心代码可能就2000行内,对高手来说三刀两斧就阅读完了,代码虽小,却是灵活强大。
用巨内核的叫水泥工,而在微内核外,那是你自由奔放的灵感创造,你就是世界的构筑者。
2、面向接口,任意角落调用
插件核心、插件服务全部以纯接口方式暴露,任何插件在任何时候可以获取任何其它插件所声明提供的接口服务,不用关心怎么处理和
这些插件的关系,人人为我,我为人人嘛。
3、扩展点概念让插件无限扩展
每个插件实现自己梦想的同时,能力大的还可以留给别人实现梦想的空间,这个空间就是扩展点,每个插件都可以向别的插件声明扩展空间,
任何其它插件都可以来实现这个扩展点,就如同一个插头又预留有插头口一样,插头和插头间可以互插而互连形成树状获得无限扩展能力,但
对于任何一个插件角度看去,任何其它插件又是平面化的,就像人与人一样,你可以与任何一个人你见到的人打交道,而不需要一定有介绍人。
扩展点概念是Eclipse的设计精髓之一,通过扩展点,能让你的界面灵活得就像Eclipse一样。
4、她只使用纯DLL做插件(当然也可用BPL,我认为那只是打个钩的事情)
Delphi下的BPL确实很好,但你一定咬牙切齿要维护一个支持那时的BPL的编译环境和控件,我也是这样想的,因此坚决支持纯正DLL。
5、她能支持除Delphi外的其它编译器生成的DLL
像VC++有这么多优秀的库,不用甚是可惜,所以,支持它编译的DLL!如果万一还有支持不住的怎么办?比如像易语言?比如在Linux下跑?
好得我也考虑到了,刚才我有把微内核比作原子,大家都知道,原子还能更细分到电子,所以,微内核里的东西还能细分出来更换呢!内核里我就有一个DLL加载器,你只要为特殊的DLL重定义一个加载器,就能跑起来了,看到这里,是不是有点跃跃欲试了哈。
6、她不需要重启就能动态更新/更换新版本的DLL插件
这功能在不能停的服务端那是相当有用对不对,听起来也很高大上对不对,其实实现很简单,你只需遵守一条规则就行,那就是她叫你释放
某个接口时你要立马无条件接受并立刻按她说的做,当然,一瞬间后她会立刻把你需要的服务接口送还给你。
7、插件懒加载,务求最少资源占用
插件框架提供总是、按需、自动管理三种方式载入插件,不必要还没有用起的插件就留着在磁盘上吧,保持她苗条秀丽的身材跑得快效率高。
在自动这种方式下,如果插件在一段时间发现没人用,就把插件卸出内存,哇,这功能好啊!很遗憾,我没有做,不是懒,因为我细想后,觉得
这件事情可划入由外部插件来插手的领域,不是原子性的范畴,以保证微内核是真的微哈。
8、手动式还是配置全由你
提供全套API让你可在程序中手动获取、管理、卸载插件DLL,当然也提供xml配置的方式自动管理插件,要不,小小程序也要配一个xml就说不过去了。
9、可能可以在Linux下跑
我只用到了D7的语言特性,因此,小改一点应可以用Lazarus跑起来,但我是Linux菜鸟,没有发言权,所以只能说可能,求高手上斧。
感觉整个篇幅下来都是我吹嘘之词。。。唉,吹壮君子胆嘛,高手莫见笑。
然后再说下怎么使用,还是很简单地:
1、解压到目录A后,在Delphi环境中,Tools–>Environment Options,打开Library标签,在Browsing Path和Library Path中包含源码中的Core目录
2、新建项目,在Project–>View Source下的uses中,首先第一个打上”WisdomFramework“,在需要跑起的地方加一句TWisdomFramework.Run就可以了
3、在需要调用框架接口的地方,uses一下接口说明文件即可,其中”WisdomCoreInterfaceForD“是给Delphi用的,给C++用的头文件在Demo的Cplus里哦
这里有一条规则:如果搞有DLL中的界面元素显示到Host主窗口,那么在主窗口的OnClose或Destroy中,一定要调用一下TWisdomFramework.Stop
具体特性参看Demo演示。
最后,说一下这个框架的设计理念,这只需要一张图就足够了,如下: