向左看,最左边是客户端;向右看,最右端是数据库;剩下的就是中间层。
  我的中间层设计为二层:业务逻辑层和数据库服务层。客户端只与业务逻辑层联系;业务逻辑层保存业务逻辑,最后将数据库操作请求发往数据服务层;数据服务层中保存的都是数据库的相关操作,也只有数据服务层可以连接数据库,别的层有数据库操作都必须通过数据库服务层去执行。
  业务逻辑层设计:目前,我的想法是:每一个客户端的窗体对应一个业务逻辑层中的一个接口。这样,查找,修改起来比较方便。这里有一个问题是:将业务逻辑层中每个窗体对应的业务逻辑作为一个接口,是一个dll中包含多个接口这种方式?还是每一个接口一个dll(也就是一个窗体的业务逻辑对应一个dll文件,这样业务逻辑层就会有数十个dll文件.这样做的好处是没有打开的窗体对应的dll不会运行)???
  数据库服务层设计:因为一个数据库也就是一二十个表,所以也就是对这一二十个表的操作。所以,我想将这些操作集中起来写成一个或两三个接口,每个接口包含若干方法。  先放100分,欢迎大家讨论!!

解决方案 »

  1.   

    数据抽象类+连接池+对象池
    必要的话再加上线程池!!
    客户端每调用一次应用服务器的接口方法后,中间层都会产生一个实现该接口的对象实例!高性能服务器必须作一些处理,使用对象池来存储部分或全部的接口实现对象!对于连接的管理,我的经验是为各用途分类建立多个Connection,如查询一个、无返回数据的SQL命令一个、执行时间长的一个(使用异步方式)。这需要自己在实践中摸索实验!
      

  2.   

    楼主的三层只是c/s结构嘛
    按现行的真3层结构去做,borland有datasnap/webservice/eco, java有ejb/corba
    客户端<->应用层<->数据库
    borland系列的应用层都是可以合并到客户端里的三层的一般做法是
    按实体对像建立接口, IUser,IxxFile,IxxReport
    按功能划分模块(dll或中间层DataModule), 把n个接口封装在这个模块里
    客户端代码界面为主,就不必划得太细了,以方便/简洁/实用为第一性
      

  3.   

       “楼主的三层只是c/s结构嘛”这句话我不同意!因为我认为我的这个才是真正的多层。
      因为我的客户端只有界面。中间层(目前包含二层:业务逻辑层和数据库服务层)全部是COM+组件,它们可分布到网络中的不同机器。
      中间层的业务逻辑层仅含有业务逻辑,没有其它成份。它是一个独立的COM+服务器。
      中间层中的数据库服务层仅含有数据库操作逻辑,没有任何其它成份。它也是是一个独立的COM+服务器。    楼上的怎么能说它是C/S结构呢?
      

  4.   

         而且刚开始时,我做的这个COM+多层程序为了设计方便使用的是ACCESS数据库,在网络中测试成功之后。我突然想将数据库迁移到sql server中,在我的这个设计中只需改动数据库服务层中的一个数据库连接字串,其它都不用改动。这也体现了COM+实现多层的好处。从access升级到sql server中,前后只花了十多分钟!!!     如果要完全测试我的这个多层程序,需要4台机器。它们分别是:客户端一台;com+业务逻辑服务器一台;com+数据服务层服务器一台;数据库服务器一台。  你能说这样的结构是c/s吗???
      

  5.   

    是三层,你这种做法是datasnap结合COM+的标准做法
      

  6.   

    多层中的中间层如何设计最好?
    --------------------------------谈一下目前做的项目~,说得不一定对,请大家指教~
    中间层我又细分了3层
    1.靠近UI的层,因为UI层分为ASP.NET与Delphi客户端,加上此层可从一定程度上解藕UI与业务层的关联,在该层
    生成线程队列,在UI申请工作时分配JobNum
    2.核心业务层,在业务层有N个子模块,用Facade模式来建立UI与子模块的关联
    3.对象层,..........
    4.数据库层:做为持久化层,用Proxy模式中介一下UI层的对象与业务层的对象
    每个层均用一个COM+完成,向外公布几个Interface,供客户端使用
    工作时一级一级地调用~
      

  7.   

    如果要完全测试我的这个多层程序,需要4台机器。它们分别是:客户端一台;com+业务逻辑服务器一台;com+数据服务层服务器一台;数据库服务器一台。   你能说这样的结构是c/s吗???
    --------------------------------------
    这和多层没有必然的联系,也可以是一台机器,业务逻辑与数据服务器在一起,你的只不过是空间上将各层分开而已~
      

  8.   

      to liangpei2008 
      用4台机器测试只是我针对上面有人说我这个是c/s结构说的。
     我知道这和多层没有必然的联系,因为我现在开发的时候就是用1台机器。C/S结构在我的印象里是二层的,而我这个真的是多层的,所以我举了上边用4台机器测试的例子。希望不要误导了大家。   大家上面说的很好,欢迎大家继续讨论!
      

  9.   

      “4.数据库层:做为持久化层,用Proxy模式中介一下UI层的对象与业务层的对象”
      
      我是楼主。
      Proxy模式--代理模式。我的这个数据服务层应该就是采用的你说的Proxy模式。我怎么就不知不觉用了代理模式,这下可以向别人吹一下了。
      

  10.   

      用DLL,最好的话,就用一下函数据激活DLL的FRM.但解决问题用最简单的方法.如果数据量不大的话C/S就够了.
      

  11.   

       “用DLL,最好的话,就用一下函数据激活DLL的FRM.但解决问题用最简单的方法.如果数据量不大的话C/S就够了.”  没搞懂说的是什么.
      

  12.   

    呵呵,Proxy模式、Facade模式、抽象工厂模式,一般做三层系统必用的:)
      

  13.   

    建议一个窗体的业务逻辑对应一个dll.这样自动升级不用下载过多东西.
      

  14.   

       “建议一个窗体的业务逻辑对应一个dll.这样自动升级不用下载过多东西.”
      
      好,终于有人支持我的这个中间业务逻辑层设计,这样升级时方便了。  不过,这样做也有负作用。其一,业务逻辑层会有一、二十个DLL文件。其二,界面中的相关窗体需要引用业务逻辑层相关的接口文件,也是有点不便。  真是鱼和熊掌不可兼得。  
      

  15.   

    用代理模式的话,会有一个问题~
    对象会保存在客户端内存中,如果客户同时打开某记录时,而保存记录的时间不一样,这样就会产生更新不一致~,会产生一致幻影数据,
    也就是说,数据库以最后的用户修改为准!而实际业务也不能将其做成单例模式,故要在中间层的Update方法来更新数据库时,应主动发消息给在线客户端,避免出错~我认为这是做3层需要注意的地方
      

  16.   

     “建议一个窗体的业务逻辑对应一个dll.这样自动升级不用下载过多东西.” 
    -------------------------------------------------------
    不太明白~
    一个业务规则对应于一个类,对应窗体做什么?