来自:arcore,  时间:2004-8-30  17:35:30,  ID:2785768    ¦  编辑  
 
===============================================================  
问题三、关于三层应用的构架思想和实现,主要基于COM+        分数:600  
===============================================================  
       这个问题,好像面很广,我一时也想不出怎么表述。这样吧,如果大家有心,手上有与这个主题相符的资料,先贴出来。我先理理思路,  
 
过两天再把问题贴出来,或是一边讨论一边提问题。  
       要求:  
       。讲述三层的构架思想,小弟也知道三层是DBMS/App  Server/Client,所以,主要讲一讲中间层的App  Server的面象对象设计与实现;  
       。近段时间,小弟在想,如果不用Delphi提供的RDM和DCOMConnection/SocketConnection,而自己用COM+对象来实现,是否可行?请大家  
 
关于这点讲一讲。  
==============================================================  
    这个问题先放一放,等我提一点具体问题出来,大家再回不迟。不过,如果哪位朋友有这方面的资料,给一个url,小弟也感激涕零。

解决方案 »

  1.   

    主  题:  1200分的问题,欢迎大家讨论之二 -- 基于COM+的多层应用开发的讨论  
    =========请问怎么可以把上面的“之二”改成“之三”啊?
      

  2.   

    我目前最感兴趣的是分布式B/S
    目前C/S市场很窄了,还是B/S有钱途
      

  3.   

    三层或者多层架构的具体实现方案有很多。。
    DELPHI提供的应用服务器估计算最易用的一种了。应用服务器未必需要面向对象设计,
    既然BORLAND的这种应用服务器本身是设计得很轻捷的,其实隐着
    不管怎样,把功能实现再说。毕竟软件以用为本。
    可以使用DCOMConnection配合COM+的。。
    就象这样         
           DCOMConnection本地连接   
    CLIENT------------------------>COM+应用代理====RPC远程调用==>COM+应用                            
    当然,不使用DCOMConnection也行.
      

  4.   

    楼上说的是,现在对于多层应用,b/s确实要比c/s更流行一些
      

  5.   


           DCOMConnection本地连接   
    CLIENT------------------------>COM+应用代理====RPC远程调用==>COM+应用                            当然,不使用DCOMConnection也行.
    ==========言之有理。如果以COM+实现的话,根本就不用DCOM了。小弟想讨论的,其实就是在这里。如果不用Delphi提供的远程数据模块与事务数据模块,直接用COM+对象来定义企业对象,把事务交给COM+的运行环境来管理,那么,当这些企业对象在链接到数据库的时候,怎么共享同一个链接的?在以前的C/S型的应用系统中,我们可以把BDE数据集组件的DatabaseName设置成同一个TDataBase上,或是把所有ADODataset组件的Connection设置成同一个ADOConnection,就可以在一个Exe中达到共享链接的目的。这个,在COM+中是如何做到的呢?有朋友说共享池,不过小弟对这个概念不大明白。还有,COM+的事务是如何控制的呢?在书上说,它提供了IObjectContextXXXXXX接口来控制COM+对象的事务,但是,小弟在具体实现上,还是有一些迷惑。希望大家帮帮忙。
      

  6.   

    不能光说B/S和C/S谁流行的问题,这样说不对的。三层中的“表现层”,既可以是B/S中的B,也可以是C/S中的C。B/S有它适用之让,C/S也有其适用之处。比如说,如果应用中有很多关于图形图像的处理,或是有很多和硬件打交道的处理,那么,我还是会选择C/S的结构。
      

  7.   

    有点细节必须说明一下,我刚才说的使TDCOMConnection,同使用DCOM连接是两回事.
    当连接本机的COM时候,TDCOMConnection实际是COM连接,并没有用到DCOM.
    之所以给出这个使用TDCOMConnection的方法,是为了客户端程序兼容旧有方法.
    为了要利用到COM+提供的服务,COM+组件必须实现IObjectControl接口.
    这是个相当简单的接口,
    三个方法
      IObjectControl = interface(IUnknown)
        ['{51372AEC-CAE7-11CF-BE81-00AA00A2FA25}']
        procedure Activate; safecall;
        procedure Deactivate; stdcall;
        function CanBePooled: Bool; stdcall;
      end;至于COM+对象要使用组件服务提供的功能,则可通过IObjectContext接口去访问.
      

  8.   

    谢谢哈欠兄的热心回复。在Delphi中,定义COM+对象可以选择New Items对话框中ActiveX页中的“事务”对象。我看了生成的代码,它是从TMtsAutoObject类继承下来的,此类实现了如哈欠兄所说的IObjectControl接口。小弟现在有几点不明之处,请大家继续讨论:    1、如果应用系统是基于COM+的,侧可以用CreateRemoteCOMObject来创建远程COM+对象,为什么还要用DCOMConnection呢?
        2、我也知道是用IObjectContext接口来控制事务,也看过此接口的那些方法。不过,哪位可否用代码具体举一个例来说明,COM+对象中,在存取数据库的时候如何提交或是回滚事务的?非常感谢。
        3、还是上面所说的COM+对象间共享数据库链接的问题,谢谢了。
      

  9.   

    有些东西最好一步步去理解,呵,所以也慢慢说。。
    1,使用CreateRemoteCOMObject应该是从DCOM方式延用下来的,
    使用COM+一般主张,仅使用CreateComObject这样,直接调用本地代理,不要指定服务器。之所以仍考虑使用TDCOMConnection的原因并不奇妙,仅因为BORLAND的MIDAS技术仍有
    它可取之处,COM+组件可以实现IAppServer接口。
    当然,你也可以自己去调用IAppserver的方法去传TCLIENTDATASET的DATA,DELTA包,那样
    编程的工作量倒也不大。但有这个方便东西为什么不用它呢?
    特别在改造旧的使用MIDAS技术系统时,这样可以相当轻松转过来。
      

  10.   

    谢谢。COM+是MTS技术在2000系统中的更名,MTS与DCOM的区别倒底在哪??一个叫事务服务器,一个叫分布式COM,嗯,DCOM是一种技术,而MTS是一种产品?之所以仍考虑使用TDCOMConnection的原因并不奇妙,仅因为BORLAND的MIDAS技术仍有
    它可取之处,COM+组件可以实现IAppServer接口。
    当然,你也可以自己去调用IAppserver的方法去传TCLIENTDATASET的DATA,DELTA包,那样
    编程的工作量倒也不大。但有这个方便东西为什么不用它呢?
    特别在改造旧的使用MIDAS技术系统时,这样可以相当轻松转过来。
    ==========================哈欠兄在这里所指,小弟不是很明白。BORLAND的MIDAS技术提供了三层架构的一种实现方式,即:Client->App Server->DBMS。在Borland的这种方式下,很多人用它开发三层,都是这样的:TClientDataSet -> TDCOMConnection/TSocketConnection -> TApp Server -> TProvider -> TDataSet -> DBMS。这样的系统,在Client存取数据的时候,其实也就是在App Server多打一个转,还是以间接的方式直接访问数据库了。而且,如果是一个大项目的话,整个系统中有数百个表,那就算是一个子系统,它的远程数据模块中的数据集组件、数据提供者组件是否也很多?这样的处理方式太繁杂,不利于维护与扩展。所以,我还是比较喜欢用类、接口封装的形式开发企业对象,与Client交互。当然,这中间,也可以用到如你所说的用TClientDataSet的Data、Delta数据包。
      

  11.   

    BORLAND的MIDAS技术,我所指的,仅是
    数据集在中间层与客户端打包传递的技术,它的核心也就是TClientDataSet,TDataSetProvider..确实,从某些设计思想来看,这种技术使用不当,本身有些破坏中间件封装,
    但对于批量数据的处理,这仍是很有效率的作法。在很大中间层架构都保留类似一
    定的批量数据传递功能。
      

  12.   

    小弟现在有几点不明之处,请大家继续讨论:    1、如果应用系统是基于COM+的,侧可以用CreateRemoteCOMObject来创建远程COM+对象,为什么还要用DCOMConnection呢?
        2、我也知道是用IObjectContext接口来控制事务,也看过此接口的那些方法。不过,哪位可否用代码具体举一个例来说明,COM+对象中,在存取数据库的时候如何提交或是回滚事务的?非常感谢。
        3、还是上面所说的COM+对象间共享数据库链接的问题,谢谢了。
      

  13.   

    对了,还有一个问题:如果COM+的客户端是在98系统下,可以吗??
      

  14.   

    有一本书叫DELPHI彻底研究那也是面讲的好象有这方面的知识,我一会儿帮你查一下.刚上发给你.
      

  15.   

    书叫DELPHI彻底研究
    ============谢谢了,静待佳音
      

  16.   

    我也跟搂主一样,正在痛苦中,
    《1》.多个客户同时调用一个com+组件,在中间层是创建多个com+对象吗?
    《2》.假如我用com+封装了一个银行存款类,如果多用户操作下,应该的线程同步吧,那位能提供一个这方面的例子阿,
      

  17.   

    用com+时,不用dcomconnection也可以的,不一定非的用。
      

  18.   

    C/S + B/S 的结合才是发展之道继续学习...
      

  19.   

    多层应用中应该把业务层分离出来客户端可以是一个应用程序(c/s多层应用),也可以是浏览器(这是就是b/s)。
    无论如何,客户端不能有任何业务逻辑,仅仅只负责显示数据、接受输入业务层没有什么好说的,就是业务逻辑部分数据库用标准的DBMS产品在业务层和数据库层之间增加数据访问层(DAO)
    DAO用于从数据库中读取数据,供业务层使用数据库-〉DAO -> 业务层 之间的数据传输使用 valueobject模式。(Valueobject一般和表对应)业务层 <-> 客户端之间的数据传输使用数据传输对象(DTO,DTO和ValueObject的含义相似,但是DTO的粒度大些)客户端既可以用应用程序把DTO显示在界面上,也可以用xslt转化为xhtml显示在浏览器上(这时需要有webServer层,所以b/s最少应该是4层结构,否则架构有问题)具体理论请参见“Patterns of Enterprise Application Architecture ”(企业应用架构模式)
    http://www.china-pub.com/computers/common/info.asp?id=18350
    目前好像还没有中文版出售
    做delphi应用很多架构中数据传输对象(DTO)都是采用clientdataset的data或delta,
    而DAO层很少见,事务处理更是有很多业务逻辑中直接调用数据库的 begintrans。其实这写问题的根源是com+(或者 com+mts)本身不适合做很大型的企业应用。
    com+的事务处理始终有问题,并且速度奇慢很难真的做到分布式应用 
    如果要求不高,项目金费不过,使用com+也行。有条件的项目最好还是谨慎选择基础平台。(IObjectContext.SetComplete表示提交,SetAbort 表示失败。
    只有一个事务内所有的对象都SetComplete,整个事务成功,否则就会回滚。
    可以在控制面板/管理工具/组件服务中修改某个组件的事务支持属性(禁用、不支持、支持、必须、要求新建)。其具体内容在李维的经典3本书中有详细解说)
      

  20.   

    steelhorse:谢谢。不过,我个人觉得,李维的方法并不是很好的方法。那是D5的时代。比如,你上面讲的做法,就和老李讲的有出入了。
      

  21.   

    数据库-〉DAO -> 业务层 之间的数据传输使用 valueobject模式。(Valueobject一般和表对应)
    =========你的意思是说,在数据访问层,还是一个数据集对象对应DBMS中的一个表或是一个View之类的?这样做,还是没有达到复用的目的,而且,如果项目中数据表很多的话,数据访问层一样的很大,升级维护一样的很难。
      

  22.   

    to:arcore ([CTC]中的人生如路) 
    是的,我讲的和李维书中的有出入,因为我看这本书时还只有d5,
    使用MTS实现事务,后来我的认识变化了,系统环境也变化了。
    其实并不是李维水平不够,是因为com(或com+)根本不是实现大型企业应用的平台。
    李维的经典3本书中有关于事务部分的描述,当时是基于MTS的,其实com+的原理是一样的.我在上贴中讲到的DAO,valueobject,DTO已经是大型企业应用中的标准模式,
    不是李维在那三本书中的内容,这些模式的大部分在
    “Patterns of Enterprise Application Architecture ”中作了归纳。(强烈推荐)<quote>
    具体理论请参见“Patterns of Enterprise Application Architecture ”(企业应用架构模式)
    http://www.china-pub.com/computers/common/info.asp?id=18350
    目前好像还没有中文版出售 </quote>ValueObject一般可以用工具生成,比如用rose肯定可以生成,也可以自己写一个小程序,根据数据库中的表的字段生成很多个.pas文件,应该在两个小时就可以搞定。用DAO把数据库封装起来,可以避免直接访问数据库.这是OR Mapping
    的内容,一般的framework中会专门提炼出实体层的概念,参见张笑猛翻译的《鲁棒的数据库持久层设计》(http://justdn.org/forum//index.php?s=cdf962be43505181cfbaec6366d4e610&act=Attach&type=post&id=2245).
    还有一个具体的实现:opf,在网上找到一个delphi版的实现,具体没有看过,可以看看
    http://www.51zyz.com/115/show_16198.htm.
    http://www.zahui.com/html/2/5624.htm当然,如果数据库结构经常变化,表之间的关系总在变,这样做效率很低,但这应该是另一个问题了,应该从开发管理的角度去解决。
      

  23.   

    初学者,不解com+的应用对象与com对象的关系?dcom组件能把功能组件与网络通讯组件统一起来么?
      

  24.   

    欢迎广大Delphi爱好者到《delphi专题研讨会》到QQ群7568683
    讨论
      

  25.   

    MIDAS的稳定性和大量用户使用时,还有在广域网时都有问题。我们公司是借鉴MIDAS,自己做了一个三层结构的应用服务器,现在在客户那边用得很好,在应用服务器管理和动态加载上作了很多自己对MIS应用的理解在里面。需要更详细的资料,请联系[email protected]
      

  26.   

    fausten(fausten):谢谢,请加我的QQ:26965829。