在小型或简单的应用中, 比如只存在一个业务逻辑类时, 可以将DataModule作为业务逻辑类的私有成员, 一起封装进DLL.
如果大型系统或复杂的应用中,有多个业务逻辑类时存在时, 这时候还是将所有的业务逻辑放在一个业务类中, 显然不可取. 
问题来了:一: 如果分开成多个业务类, 且每个业务类都要通过DataModule访问数据库, 在这种情况下, 如果每个业务类都把DataModule做为自己的私有成员进行封装, 那不是有多少个业务类就有多少个DataModule? 这种设计可取吗?二: 如果说一个业务类就有一个DataModule的设计不好, 那用什么好的方法能实现让这些不同的业务类都共享一个或少数几个DataModule呢? 三: 如果我将DataModule单独封装到一个DLL中, 哪个界面要和数据库打交道, 我就加载这个DLL, 由于DLL封装的对象只能在DLL中创建, 那这个创建的过程放在DLL导出的某个函数中创建和放在DLL的入口点处进行创建, 这两种方法各有什么优缺点?各
用在什么场合好? 假如在DLL的入口点处创建, 如果界面A和界面B(A和B封装在不同的DLL中,主程序调用)都要加载该DLL, 那我在界面A中加载, 使用好后关掉界面A, 再打开界面B, 这时不用再次创建DataModule对象就可直接使用吗? 如果放在DLL导出的某个函数中创建DataModule, 打开界面B后, 也要再次使用函数创建对象吗? 如果要再次创建对象, 界面B中创建的这个对象和先前界面A中创建的对象是同一个吗?四: 如果我在主程序中先加载已经单独封装好的DataModule(DLL), 然后把创建好的DataModule对象作为参数传递到要使用的
业务类(DLL)或者窗体界面中, 此种方法可取否? 有什么优缺点?五: 第三点和第四点中的方法, 哪个更好点?分不多了。请大家见谅!

解决方案 »

  1.   

    才疏学浅,没有具体使用过BPL,是不是用BPL来封装的话,就不会存在这些问题?
      

  2.   

    DataModule也是一个类, 一个DataModule对应一个业务对象也不是不可。DataModule的“胖”或“瘦”,看情况自己取舍。
    另外。DataModule封装到DLL/BPL里,最好通过“接口”来提供服务,而不是把整个Class暴露出来。
      

  3.   

    一、将TDataModule单独封装到一DLL中,在DLL的入口点创建DataModule,在DLL中输出一切与数据库操作相关的函数或过程(这些函数或过程通过DataModule与数据库交互)。这种形式类似于:客户代码-->函数或过程-->DataModule对象-->数据库。
    优点:模块相对独立,在数据库打交道的界面或业务逻辑中,不需要use这个模块,只需直接加载DLL中输出的相关函数即可;以后改动时,只需改该模块,其他不用改动。
    缺点:在与数据库打交道的界面或业务逻辑中,使用DLL中输出的相关函数前,要事先声明这些函数原型,如果函数很多的时候,要一一声明有点麻烦;因为大量使用函数或过程,似乎更像面向过程编程。
    二、将TDataModule单独封装到一DLL中,同时声明一个接口,接口中定义好与数据库操作相关的函数,让TDataModule继承该接口并一一实现这些函数. DLL只输出一个函数,该函数用来返回创建的DataModule对象。在主程序中加载这个函数来引用对象。再将该对象传递到与数据打交道的界面或业务逻辑中。这种形式类似于:客户代码-->DataModule对象-->数据库。
    优点:只在主程序中加载一次该DLL即可。
    缺点:在要使用DataModule的地方,都要uses接口所在的单元,以便定义接口变量;如果接口设计不好,以后常变动,那uses到接口单元的模块都要重新编译以上两种方法是自己在分别实现过程中感受到的。恳请大家提供其他宝贵意见和经验。
    是砖是玉,我都接了。:)
      

  4.   

    一、将TDataModule单独封装到一DLL中,在DLL的入口点创建DataModule,在DLL中输出一切与数据库操作相关的函数或过程(这些函数或过程通过DataModule与数据库交互)。这种形式类似于:客户代码-->函数或过程-->DataModule对象--> 数据库。
    优点:模块相对独立,在数据库打交道的界面或业务逻辑中,不需要use这个模块,只需直接加载DLL中输出的相关函数即可;以后改动时,只需改该模块,其他不用改动。
    缺点:在与数据库打交道的界面或业务逻辑中,使用DLL中输出的相关函数前,要事先声明这些函数原型,如果函数很多的时候,要一一声明有点麻烦;因为大量使用函数或过程,似乎更像面向过程编程。使用bpl就没有这些麻烦了。
      

  5.   

    看来真的要好好研究下BPL封装了。