我现在手里面有一个项目,想要采用三层的技术来实现。但是在项目构思的过程中,面临一个难点,即,在服务器部分是否应该分成两个部分,其一为数据服务层。它的功能是接收客户端的输入,并把输入及时地更新到后台的数据库中。而另一部分为原始数据的com对象表示层,它把从服务器接收到的数据转换成容易操作的com对象交给界面程序使用。按照我的想法,像这种结构,它的结构更清晰,同时避免了,界面程序和数据操作夹杂在一起的缺点。或许这样的结构对以后的系统升级带来方便。
  不过这里有一个难点就是在服务器的两部分之间,以何种方式来进行有效的通讯,既要有效率,同时要有编程的方便性。(注:这服务器的两部分,一部分部署在真正的服务器上,而另一部分则部署到客户机上)我想xml是否是一个理想的方案?--可惜本人对xml知之甚少!而且有一个对我来说更要命的问题是:如果真的采用这种结构,似乎意味着要自己来实现数据的缓存(以提供给用户一个机会,让他更新或者放弃所做的对数据的修改)。
  欢迎大家给提点思路!

解决方案 »

  1.   

    这里有个三层的设计,大概就是这个意思:
    *******************************************************************
    我在设计一个mis系统。我这样设计不知是否正确?以工厂领料单维护为例。我设计了四个类,roughInterface类,roughMgr类,roughCollection类,rough类。roughInterface类负责接收系统界面传来的信息;roughMgr类负责协调各类,同时完成复杂算法;roughCollection类可以进行集合的各种操作(交、并、差等),这样可以方便地进行选取、合并及排除等各项操作;rough类包含领料单据的信息,属性与数据库的表一一对应,同时操作中有领料单据的信息的保存、删除、修改、查询等操作。我把这四个类包装为一个组件,接口包括信息的保存、删除、修改、查询及特殊算法等操作,供系统界面调用。系统界面用asp开发。请问我这样设计合理吗?以下是台湾高焕堂先生的回答:谢谢! hi swl, 1.roughInterface類是對的,能落實為web service支持asp的web form。 2.roughMgr類應該只負責協調各類,是business process object的角色。 3.可以新增roughBo類,完成複雜演算法,是business object的角色。將BPO與BO分開能大幅提升系統的彈性。 4.roughCollection類可以是roughMgr類的inner類。 5.rough類可改為roughDs類,是DB裡data record的Wrapper。 !!!!
    *******************************************************************
    多层之间传输记录集的话有些问题,我是在多层之间传递XML,然后在最外层转换会记录集,客户端可以自己用记录集来缓存数据。
    一点思路,仅供参考!
      

  2.   

    TO eastphoenix(红苹果)(蓉儿!蓉儿!你在哪儿?) ( :
      据我所知,在Delphi中要把数据从clientdataset转换到xml格式,似乎要什么data mappings。这样一来就不得不在客户端暴露后台数据的格式,而且另外一个问题,如果采用这种手段,也对原始数据对象化带来不便。
      欢迎继续!!
      

  3.   

    按理说应该是这样的。但实际做起来恐怕又是另一回事。因为当你的系统真在一次查询中只产生1000条数据,我觉得很是幸运。1000条数据对应1000个对象实例算不了什么(至少我是这么觉得的,呵呵)。所以很多场合都争取尽量使查询所产生的数据量保持在一定的比例。
      我现在所面临的问题倒没有考虑,这样做所带来的内存使用问题。我尚在考虑在对象化数据时所应该采用的数据格式怎么样才算合理--xml是一种?!或者其它自定义数据格式?!我也不知道。
      

  4.   

    客户端需要很多的类定义喽,要是在ASP里也可以用类吗?
    1000条记录我觉得都是多,完全可以一次取10条,翻页嘛,下次再取10条,top 10即可。暴露后台数据格式有什么缺点呢?
    我是用ADO原生接口来转换xml,没用过clientdataset这个东东。
    用ADODB_TLB的_Recordset的一个方法。XML挺好的,Recordset也不错啊:)
    累了,先走了。还未吃呢:)
      

  5.   

    看了半天,
    不知道各位是不是这个意思: 怎么把多条纪录在服务器与客户端中传送?        
    如果是的话:
    clientdataset有个xmldata属性,
    在客户端与服务器端个放置一个,
    将clientdataset1.CommandText与clientdataset1.XMLData互相转化就行了
      

  6.   

    我现在也在做一个类似的项目,基本框架以实现,
    在win98,win2000下调试成功.
      

  7.   

    TO myling(阿德):
      我的问题主要是体现在,当我们在使用com+来开发三层应用的时候,是否应该如一些对OO很有兴趣的朋友那样把数据库中的数据转换到一个个的易于操作的对象(其实就我个人来讲,这似乎和java的j2ee模型比较类似)。而且我不想在客户端或者服务器端用clientdataset--因为我感觉使用clientdataset很多时候确实很方便,但是在数据查询比较频繁的场合,它的效率似乎不是很高,因为它总是在内存中缓存查询所得到的数据-个人的感觉!不见得正确。
      所以我在想是否有其它的方法可以高效的实现服务器和客户端的数据交换。即由服务器根据客户端的要求从后台数据库中提取相应的数据,然后发送到客户端,由客户端根据所得到的数据一一把它们对象化(转换成相应的对象)供客户程序使用?我不想让我的客户程序直接跟原始数据打交道,否则的话,用户界面老是跟数据逻辑缠绕在一起,很麻烦。这个问题困扰了我很久。
      

  8.   

    客户端直接用apperver接口调用服务器端的函数,怎么会客户程序直接跟原始数据打交道?
    例如 你在原始数据的com对象这部分加上
     
     ADOConnection、 
     ADODataSet(commandtext一定要为空)、
     ClientDataSet、
     DataSetProvider(dataset=ADODataSet1),  
     编写你想要实现的函数功能注册成activex控件以后,放在服务器端的com模块里
    在服务器端的com模块里编写函数调用原始数据的com
    想要实现的函数功能最后在客户端直接调用apperver.XXX()就行了。至于你说的但是在数据查询比较频繁的场合,我觉得足以应付了
      

  9.   

    多谢各位的指点,目前对于自己的系统的整个构思多少有了点想法,本来应该就结帖了,但是我有点贪,想多听听各位平常在三层应用的开发中产生的一些想法。我想只有这样才能继续拓展自己的思路。
      比如,在使用纯com进行开发的时候,你们是怎样调整自己的程序,使之对待的更有效率。或者是否有人在客户端和服务器端的数据交换上使用了自定义的数据格式等等。
      还有我一定会结账的。如果感觉分不够的话,还可以另加(不是分的问题,主要想和大家多交流交流)。