来自:arcore, 时间:2004-8-30 17:35:30, ID:2785768 ¦ 编辑
===============================================================
问题三、关于三层应用的构架思想和实现,主要基于COM+ 分数:600
===============================================================
这个问题,好像面很广,我一时也想不出怎么表述。这样吧,如果大家有心,手上有与这个主题相符的资料,先贴出来。我先理理思路,
过两天再把问题贴出来,或是一边讨论一边提问题。
要求:
。讲述三层的构架思想,小弟也知道三层是DBMS/App Server/Client,所以,主要讲一讲中间层的App Server的面象对象设计与实现;
。近段时间,小弟在想,如果不用Delphi提供的RDM和DCOMConnection/SocketConnection,而自己用COM+对象来实现,是否可行?请大家
关于这点讲一讲。
==============================================================
这个问题先放一放,等我提一点具体问题出来,大家再回不迟。不过,如果哪位朋友有这方面的资料,给一个url,小弟也感激涕零。
===============================================================
问题三、关于三层应用的构架思想和实现,主要基于COM+ 分数:600
===============================================================
这个问题,好像面很广,我一时也想不出怎么表述。这样吧,如果大家有心,手上有与这个主题相符的资料,先贴出来。我先理理思路,
过两天再把问题贴出来,或是一边讨论一边提问题。
要求:
。讲述三层的构架思想,小弟也知道三层是DBMS/App Server/Client,所以,主要讲一讲中间层的App Server的面象对象设计与实现;
。近段时间,小弟在想,如果不用Delphi提供的RDM和DCOMConnection/SocketConnection,而自己用COM+对象来实现,是否可行?请大家
关于这点讲一讲。
==============================================================
这个问题先放一放,等我提一点具体问题出来,大家再回不迟。不过,如果哪位朋友有这方面的资料,给一个url,小弟也感激涕零。
解决方案 »
- 怎么修改下面的SQL语句?
- update语句语法错误。请给改下吧。不知哪里错了
- 正则表达式如何提取不确定组数的所有组数据?请进看解释:
- 今天重装Delphi7.0,发现在安装到输入注册码时,输完后,点下一步程序没有反应,也没任何提示,就老停留下输入注册码的界面???
- 请问:如何防止QQ的捕捉屏幕来切程序界面...
- 请问MDI窗体是不是不能钱套 APPLICATION窗体啊
- 我得到了Msg.LParam,并且知道它发过来的是一串字符,请问怎样将Msg.LParam转成字符串显示出来?
- 像ADOConnection的ConnectionString的属性编辑器那样的窗体怎么做?
- 请问在dataset中如何在程序中知道通过字段名知道其类型!谢谢!
- 请问如何使label 控件在运行时处于设计状态
- 怎么F12键就是不能做虚拟键呢?
- 怎么在delphi中访问SQLServer2000数据库
=========请问怎么可以把上面的“之二”改成“之三”啊?
目前C/S市场很窄了,还是B/S有钱途
DELPHI提供的应用服务器估计算最易用的一种了。应用服务器未必需要面向对象设计,
既然BORLAND的这种应用服务器本身是设计得很轻捷的,其实隐着
不管怎样,把功能实现再说。毕竟软件以用为本。
可以使用DCOMConnection配合COM+的。。
就象这样
DCOMConnection本地连接
CLIENT------------------------>COM+应用代理====RPC远程调用==>COM+应用
当然,不使用DCOMConnection也行.
DCOMConnection本地连接
CLIENT------------------------>COM+应用代理====RPC远程调用==>COM+应用 当然,不使用DCOMConnection也行.
==========言之有理。如果以COM+实现的话,根本就不用DCOM了。小弟想讨论的,其实就是在这里。如果不用Delphi提供的远程数据模块与事务数据模块,直接用COM+对象来定义企业对象,把事务交给COM+的运行环境来管理,那么,当这些企业对象在链接到数据库的时候,怎么共享同一个链接的?在以前的C/S型的应用系统中,我们可以把BDE数据集组件的DatabaseName设置成同一个TDataBase上,或是把所有ADODataset组件的Connection设置成同一个ADOConnection,就可以在一个Exe中达到共享链接的目的。这个,在COM+中是如何做到的呢?有朋友说共享池,不过小弟对这个概念不大明白。还有,COM+的事务是如何控制的呢?在书上说,它提供了IObjectContextXXXXXX接口来控制COM+对象的事务,但是,小弟在具体实现上,还是有一些迷惑。希望大家帮帮忙。
当连接本机的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接口去访问.
2、我也知道是用IObjectContext接口来控制事务,也看过此接口的那些方法。不过,哪位可否用代码具体举一个例来说明,COM+对象中,在存取数据库的时候如何提交或是回滚事务的?非常感谢。
3、还是上面所说的COM+对象间共享数据库链接的问题,谢谢了。
1,使用CreateRemoteCOMObject应该是从DCOM方式延用下来的,
使用COM+一般主张,仅使用CreateComObject这样,直接调用本地代理,不要指定服务器。之所以仍考虑使用TDCOMConnection的原因并不奇妙,仅因为BORLAND的MIDAS技术仍有
它可取之处,COM+组件可以实现IAppServer接口。
当然,你也可以自己去调用IAppserver的方法去传TCLIENTDATASET的DATA,DELTA包,那样
编程的工作量倒也不大。但有这个方便东西为什么不用它呢?
特别在改造旧的使用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数据包。
数据集在中间层与客户端打包传递的技术,它的核心也就是TClientDataSet,TDataSetProvider..确实,从某些设计思想来看,这种技术使用不当,本身有些破坏中间件封装,
但对于批量数据的处理,这仍是很有效率的作法。在很大中间层架构都保留类似一
定的批量数据传递功能。
2、我也知道是用IObjectContext接口来控制事务,也看过此接口的那些方法。不过,哪位可否用代码具体举一个例来说明,COM+对象中,在存取数据库的时候如何提交或是回滚事务的?非常感谢。
3、还是上面所说的COM+对象间共享数据库链接的问题,谢谢了。
============谢谢了,静待佳音
《1》.多个客户同时调用一个com+组件,在中间层是创建多个com+对象吗?
《2》.假如我用com+封装了一个银行存款类,如果多用户操作下,应该的线程同步吧,那位能提供一个这方面的例子阿,
无论如何,客户端不能有任何业务逻辑,仅仅只负责显示数据、接受输入业务层没有什么好说的,就是业务逻辑部分数据库用标准的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本书中有详细解说)
=========你的意思是说,在数据访问层,还是一个数据集对象对应DBMS中的一个表或是一个View之类的?这样做,还是没有达到复用的目的,而且,如果项目中数据表很多的话,数据访问层一样的很大,升级维护一样的很难。
是的,我讲的和李维书中的有出入,因为我看这本书时还只有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当然,如果数据库结构经常变化,表之间的关系总在变,这样做效率很低,但这应该是另一个问题了,应该从开发管理的角度去解决。
讨论