最近要为一个客户做一个项目,比较复杂,客户要求做得非常灵活。要使用到插件技术。这几天想了想,隐隐约约有了点眉目,但又有点糊涂,想得到各位高手的指点。项目要做得非常灵活,通过插件技术,客户可以自己根据自己的需要开发相关的插件。(客户有开发能力,这个项目有点像Eclipse,因为业务原因,又得用Delphi开发)要求:
根据客户的需求,我们开发出整个系统,在功能无误后,提交给客户。客户要求,自己可以向系统里面增加新的功能(通过插件,像Eclipse),定义配置文件,可以在主界面中进行调用他们自行开发的模块。如果他们的业务有所变化,他们也可以通过自己开发的方式,扩展系统中以有的功能,比如在原系统中,某一个功能中,增加他们自己新开发的一些业务操作,或窗体等。也可以覆盖原系统中的功能。业务有变,如果原系统中的功能不能完成,客户可以插件方式,覆盖原系统中的某项功能,执行他们自己开发的模块里的功能。反正很BT的要求,不知道我说明白了没有,我感觉就像Eclipse一样,但是考虑到执行效率,最好的选择,就是Delphi了。这几天被它都搞糊涂了。又要规划,又要考试技术,想来想去,在Delphi里,最好就是COM了,但我个人又不愿意用COM。不知道有没有什么更好的方法。还是只能用COM。还有,具体怎么去实现呢?
我用COM做了一个小例子,但是,如果知道有新的插件,并调用新的插件,和对原有功能进行扩展、以及覆盖原系统中的功能,还没有想透。各位高手不吝赐教,给点思路,谢谢了。

解决方案 »

  1.   

    这个基本上很复杂, 工作量大了去了
    因为, 对于这种模式, 有以下几种考虑:
    1. 你需要调用客户的组件, 这个与一般COM使用差别不大, 主要差别是组件的实例的创建
    2. 客户需要调用你的部分, 这个工作量就大了, 与传统开发不同, 你现在所有能够被客户组件, 都需要首先声明接口, 然后实现接口.
    3. 你还需要有插件的管理功能
    4. 因为有些插件涉及UI操作, 你还要提供接口, 如有的插件需要通过用户点击菜单项调用, 此时, 你还要提供客户组件增加菜单项之类的功能.我原来做个一个类似的项目, 感觉工作量至少大一倍
      

  2.   

    楼上说的没有错,工作量大很多,尤其是测试工作量,另外,要支持二次开发,因为要给客户提供sdk缘故,整个系统的框架要更加的灵活,从一开始就将可扩展性作为首要考虑的因素;另外,说到插件用COM,我并不以为非得用com不可,就简单的使用dll就可以做得到了,
    只要把插件管理的功能作得好,提供一个通用的dll sdk给用户就可以了当然,也不排除有特殊的情况,是dll作不到了,呵呵,
      

  3.   

    客户是一个国有企业,他们信息中心里有几个人会Delphi,他们的信息中心主任一直在捣鼓这个东西,所以,就要我们开发成这个样子。感觉就像是用Delphi做一个类似于Eclipse的框架出来。项目说实话,不算太大,就是做这种框架比较麻烦,他们也知道,因为他们是搞计算机的,对本单的业务,也说不出所以然来,只能就他们的理解,实现一部分,然后,他们自己再去开发,有一些也设计到一些机密吧,我想。但是因为这个客户有长期有业务来往,不能得罪。现在大脑里每天都是插件、插件、插件。
      

  4.   

    现在看了下Delphi 和ToolsAPI,感觉也差不多,谁这文件的经验?
      

  5.   

    http://www.2ccc.com/article.asp?articleid=1201
    tools api 的
    cnpack的代码可以参考下
      

  6.   

    這種需求可以使用fastscript控件來滿足,這是fastreport控件組中的一組控件。這是delphi的vcl pascal腳本解釋器,你的主程序調用基於文本格式的vcl pascal文件或者pcscal字符串來運行,支持數據庫、ado,甚至是form窗體。而且支持fastscript腳本變量與delphi主程序中的變量互相傳遞參數及賦值。只要是會delphi編程的,就能用fastscript來寫應用邏輯。
      

  7.   

    To mrzj(mrzj) 曾经也有过这种想法,但是因为不知道如何实现就打消了。谢谢。试下先。
      

  8.   

    OleContainer + MSScriptControl 就可以搞定
    首先,你要使用MSScriptControl,然后你要放上OleContainer(或其他兼容的组件),你的用户无论用什么语言写的ActiveX组件都可以被你用Ole调用创建,你确认创建好用户的插件后,把插件的IDispatch传给MSScriptControl,你的用户就能够通过脚本操纵控件了
      

  9.   

    根据大家的想法,我理了一下思路,不知道对不对.希望大家指教指教.
    学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做还是有一些小小的麻烦.
      

  10.   

    用mrzj(mrzj) 和 mbmseason(食神)的方法,通过脚本的形式来实现,但是有一些不确定,这些东西能不能实现高强度的运行能力.因为有很多业务,我们是不知道的一些强度运算(涉及到秘密).
      

  11.   

    我个人认为不推荐使用Com方式,倒是可以考虑bpl或者自定义格式dll。通过接口来实现主体程序和插件的功能互访。
      

  12.   

    使用插件方式设计,可以参考一些源码
    我觉得简单轻巧的有下面一些,如果楼主时间比较充裕,可以看一看.比较有名的开源C# IDE.
    #develop  (http://www.icsharpcode.net/OpenSource/SD/)即时通讯软件,它的插件设计非常简易.核心是C++编写,但改成DELPHI应该是比较容易的.
    mirandaIMJAVASCRIPT做的东西,它的核心设计使用了消息队列思想与观察者模式.
    mapbuilder(http://sourceforge.net/projects/mapbuilder)
      

  13.   

    推荐用bpl通过数据库一张表来维护bpl中的路径什么的,然后主框架每次启动时,自动加载最新的功能树,点击某一结点,自动加载某一bpl如果做是简单点,bpl都放在一起就是了,呵呵
      

  14.   

    建议用标准DLL或COM、 COM+来实现,不要用DELPHI特有的BPL。
    这样客户可以用DELPHI、C++甚至是VB来扩展你的程序。
      

  15.   

    谢谢楼上的各位:
    halfdream(哈欠) 你提供的东西很好,正在看.这个系统只能用Delphi开发,因为用户要求的,没办改变.所以只能从Delphi里打突破口.
    skypeople(飞飞) 说得很好,以前虽然做过设计,但是这种类型的,还没有接触过.只有自己摸索,谢谢各位的帮助.最开始是想用DLL方式实现,但想到用户要重叠系统功能,如果用DLL的话,用户对DLL中某个功能进行重叠,但又不安全实现我DLL中所以的功能,觉得实现起来很麻烦.
    我也不大愿意用COM方式,想借鉴一下JAVA和DotNET中的接口方式来实现.但是Delphi的接口做得不够好,做成DLL方式,客户想做二次开发,就得提供源码,这样维护起来很麻烦.版本不好管理.相比之下,COM就有一点点小的优势,再说,用到接口,Delphi里的接口很容易实现COM.
    没办法,只能试试了.希望大继续关注这个帖子.