最近要为一个客户做一个项目,比较复杂,客户要求做得非常灵活。要使用到插件技术。这几天想了想,隐隐约约有了点眉目,但又有点糊涂,想得到各位高手的指点。项目要做得非常灵活,通过插件技术,客户可以自己根据自己的需要开发相关的插件。(客户有开发能力,这个项目有点像Eclipse,因为业务原因,又得用Delphi开发)要求:
根据客户的需求,我们开发出整个系统,在功能无误后,提交给客户。客户要求,自己可以向系统里面增加新的功能(通过插件,像Eclipse),定义配置文件,可以在主界面中进行调用他们自行开发的模块。如果他们的业务有所变化,他们也可以通过自己开发的方式,扩展系统中以有的功能,比如在原系统中,某一个功能中,增加他们自己新开发的一些业务操作,或窗体等。也可以覆盖原系统中的功能。业务有变,如果原系统中的功能不能完成,客户可以插件方式,覆盖原系统中的某项功能,执行他们自己开发的模块里的功能。反正很BT的要求,不知道我说明白了没有,我感觉就像Eclipse一样,但是考虑到执行效率,最好的选择,就是Delphi了。这几天被它都搞糊涂了。又要规划,又要考试技术,想来想去,在Delphi里,最好就是COM了,但我个人又不愿意用COM。不知道有没有什么更好的方法。还是只能用COM。还有,具体怎么去实现呢?
我用COM做了一个小例子,但是,如果知道有新的插件,并调用新的插件,和对原有功能进行扩展、以及覆盖原系统中的功能,还没有想透。各位高手不吝赐教,给点思路,谢谢了。
根据客户的需求,我们开发出整个系统,在功能无误后,提交给客户。客户要求,自己可以向系统里面增加新的功能(通过插件,像Eclipse),定义配置文件,可以在主界面中进行调用他们自行开发的模块。如果他们的业务有所变化,他们也可以通过自己开发的方式,扩展系统中以有的功能,比如在原系统中,某一个功能中,增加他们自己新开发的一些业务操作,或窗体等。也可以覆盖原系统中的功能。业务有变,如果原系统中的功能不能完成,客户可以插件方式,覆盖原系统中的某项功能,执行他们自己开发的模块里的功能。反正很BT的要求,不知道我说明白了没有,我感觉就像Eclipse一样,但是考虑到执行效率,最好的选择,就是Delphi了。这几天被它都搞糊涂了。又要规划,又要考试技术,想来想去,在Delphi里,最好就是COM了,但我个人又不愿意用COM。不知道有没有什么更好的方法。还是只能用COM。还有,具体怎么去实现呢?
我用COM做了一个小例子,但是,如果知道有新的插件,并调用新的插件,和对原有功能进行扩展、以及覆盖原系统中的功能,还没有想透。各位高手不吝赐教,给点思路,谢谢了。
因为, 对于这种模式, 有以下几种考虑:
1. 你需要调用客户的组件, 这个与一般COM使用差别不大, 主要差别是组件的实例的创建
2. 客户需要调用你的部分, 这个工作量就大了, 与传统开发不同, 你现在所有能够被客户组件, 都需要首先声明接口, 然后实现接口.
3. 你还需要有插件的管理功能
4. 因为有些插件涉及UI操作, 你还要提供接口, 如有的插件需要通过用户点击菜单项调用, 此时, 你还要提供客户组件增加菜单项之类的功能.我原来做个一个类似的项目, 感觉工作量至少大一倍
只要把插件管理的功能作得好,提供一个通用的dll sdk给用户就可以了当然,也不排除有特殊的情况,是dll作不到了,呵呵,
tools api 的
cnpack的代码可以参考下
首先,你要使用MSScriptControl,然后你要放上OleContainer(或其他兼容的组件),你的用户无论用什么语言写的ActiveX组件都可以被你用Ole调用创建,你确认创建好用户的插件后,把插件的IDispatch传给MSScriptControl,你的用户就能够通过脚本操纵控件了
学Delphi已经很多年了,但是近几年也用得少了.有些东西记忆也淡了.首先,这个项目是基于插件模式,借鉴Eclipse的方法,当然,也许达不到,但看看了Delphi的Open API,感觉用Delphi这种办法也可以实现.一切从接口开始.将UI层和业务层分离。程序的控制由Core类完成,包括界面的创建,释放,UI和业务层的关联。
[但这里又有一个小问题: 在建一个窗体的时候,Delphi总会跟我建一个相关的类,和DFM文件,自动关联起来,我现在是在想,要不要将窗体的Dfm文件和类彻底分离,通过我的Core来进行装载,DFM只做为了个资源存在,在程序运行前,DFM是不知道和哪个类相关联的,但是这样又太复杂了.以前也没有做过这么复杂的东西.]业务类对UI上的一些操作,进行控制,比如某个按钮的事件,窗体在装入时的事件等,Core类关联UI和业务类,业务类再创建UI,并初始化UI的一些操作.
[这样的好处就是,如果用户定义了新的插件,通过Core的控制,就像使用自己的系统内的一个类一样的使用. 同样,如果用户覆盖了系统里以前的某个模块,Core类就可以从插件里去装载这个业务类,和UI层.]
[同样的难题,UI层和业务层之间的一些操作如何介定,哪些是属于UI层去完成,哪些又该由业务类去完成,如果用户覆盖了系统中原有的业务类,一些基本的控制,用户是不是也得去实现.]相比之下,JAVA和DotNET在之方面有先天的优势.用Delphi做还是有一些小小的麻烦.
我觉得简单轻巧的有下面一些,如果楼主时间比较充裕,可以看一看.比较有名的开源C# IDE.
#develop (http://www.icsharpcode.net/OpenSource/SD/)即时通讯软件,它的插件设计非常简易.核心是C++编写,但改成DELPHI应该是比较容易的.
mirandaIMJAVASCRIPT做的东西,它的核心设计使用了消息队列思想与观察者模式.
mapbuilder(http://sourceforge.net/projects/mapbuilder)
这样客户可以用DELPHI、C++甚至是VB来扩展你的程序。
halfdream(哈欠) 你提供的东西很好,正在看.这个系统只能用Delphi开发,因为用户要求的,没办改变.所以只能从Delphi里打突破口.
skypeople(飞飞) 说得很好,以前虽然做过设计,但是这种类型的,还没有接触过.只有自己摸索,谢谢各位的帮助.最开始是想用DLL方式实现,但想到用户要重叠系统功能,如果用DLL的话,用户对DLL中某个功能进行重叠,但又不安全实现我DLL中所以的功能,觉得实现起来很麻烦.
我也不大愿意用COM方式,想借鉴一下JAVA和DotNET中的接口方式来实现.但是Delphi的接口做得不够好,做成DLL方式,客户想做二次开发,就得提供源码,这样维护起来很麻烦.版本不好管理.相比之下,COM就有一点点小的优势,再说,用到接口,Delphi里的接口很容易实现COM.
没办法,只能试试了.希望大继续关注这个帖子.