|
怎么运用这种技术(通过案例)
文章来源:
发布时间:2006-10-19
智能客户端程序一般都具有偶尔性连接的特征,所以我着重讲述偶尔连接的智能客户端应用程序。同时,其与网路的通讯又有四种方法——Enterprise Services,.NET remoting,Message Queuing(消息队列)和Web services。基于普遍的观点——Web 服务是生成大多数智能客户端应用程序的最佳方法。故在针对面向服务的方法和面向数据为中心的方法的选择中,我决定选择前者,因此,我重点讲述以Web Services作为首选通讯方式,面向服务的智能客户端技术。
设计面向服务的智能客户端技术,关键要解决如下几个问题,为使讲述清晰,我将以一个案例作为例子。
我们要实现这样一个购书软件(姑且命名为BuyBook),服务端有数据库,包含两张数据表。一张表简单的描述了书籍的价格,这些价格是变动的,管理员可以通过工具对里面的数据进行改动;另外一张表则是书籍的订单,记录着订购者ID,订购书的ID和订购数量。两表只有书的ID作为主外键关联着。服务端还创建了必要功能的web服务,以供客户端调用。
下面继续接着讲面向服务的Smart Client技术关键解决的几个问题。
1) 连接的管理
智能客户端软件当然不能过于频繁地访问网络上的服务端,因为这样会严重影响软件的性能,另外,对于连接发生的更改(包含如手动连接、自动连接、连接意外中断和连接长期不用等情况)软件也要作出相应的反应,以体现其智能的特点。
那么关于连接的管理有些什么适合的方案呢,我将以我举的范例为例,设计其在这方面的处理方法。
BuyBook应该尽量避免和网络上的服务端进行交互,即使网络连接可用。可以优先假设为离线操作,在机器本地进行事务处理,当然这样会造成一定的问题,有可能系统数据没有和服务端数据同步,导致本地操作无效。如服务端书本的价格作为系统参数保留在本地,当系统的数据变化时,用户在客户端看到的书本的价格就不是真实的行情了。所以虽然优先离线操作,也要考虑到数据出现不一致的情况,在数据冲突处理会得到详细解答。
在一些特殊的例子中,如购买股票的情况,由于股票的行情是不断变化的,所以,为使本地数据能体现真实的情况,网络连接应该采用隔时便来一次与服务端交互的动作,这个“隔时”的时间长度,可以用户自定义,也可以是系统默认。
我们还可以提供给用户这么一个功能,他只需点一个按钮,发送出一个访问服务端的命令,这时连接建立,并保持这个连接,直到手动断开,或网络不可用。我们称之为“手动连接”,与之相对应的是“自动连接”,当连接可用时,保持连接状态,将缓存中的数据处理,发送到服务端,并获取服务端最新的一些共用系统参数。
总而言之,对于连接,在设计系统时要把它看作是奢侈品,优雅的对待网络,无论网络处于什么状态,用户的数据操作都可以放在本地缓存。
2) WEB服务的交互
面向服务的智能客户端应用程序,通过网络与服务端的交互工作重点就在于web service上。按照前面所言,应该减少这种服务端上的远程交互,可以将本地操作缓存,并且在与web服务交互过程中,不必等待返回信息,在这延迟中可以进行其他的操作。那么要实现这种延迟不影响工作的功能,最有效的办法就是使用异步通讯的方式,可以考虑使用多线程。
WEB服务使用XML技术,CRUD(Creat Read Update Delete)类型的数据库操作,可以都通过Web Service。那么,就要讲究Web Service里交互方法的定义了。当客户进行一个Create操作时,可能关联到系统参数,例如BuyBook应用程序,当客户提交订购单时,Web服务应该先检查本地的商品价格与服务端的价格是否一致,如果价格已经不同,应该提示客户更新最新的价格,然后再作订购行为的判断。Upate和Delete操作,很可能导致数据冲突。例如删除动作,应该在客户端上将相关记录标记为暂时删除,然后在服务器上将删除请求排队。服务端进行删除时一定要检测是否有数据冲突,如果出现冲突,还要进行数据冲突的处理。
3) 本地数据缓存
智能客户端为了能及时地响应用户的操作,同时也是为了满足脱机离线工作的需要,就必须将常用的固定的服务端数据缓存到本地。
如果连接是处于在线状态的,本地数据可以暂时保存在内存中,ADO.NET里的DataSet本身就是可以用内存临时存储的数据对象,数据在内存中存储只是一个临时过渡,当数据需要经过操作后保存回远程数据库时,方法可以使用DataSet的数据适配器DataAdapter将变化的量返回数据库操作,这样既加快了本地的反应又节省了带宽。
如果,应用程序在断线的状态下工作,则将数据保存回本地的数据存储结构,待再次连线时,装载进DataSet,进行处理。
4) 数据冲突处理
造成数据冲突最常见的原因包括用户在执行更新或删除数据的操作时,有可能该数据已经被删除掉了,这样应用程序找不到更新或删除的项,自然就会引发异常而出错。处理这样的情况,可以采用一个简单的办法,数据适配器DataAdapter能对DataSet变化进行判断——当数据往数据库返回时,DataAdapter的Update方法可以检查DataSet里每个DataRow的RowState,从而可以判断该DataRow是最新的,还是已修改或已经删除的,然后执行适合的数据库操作,像找不到数据的那种情况,DataAdapter将得知数据库受影响的行数不大于零,并产生异常,从而停止更新。然后,应用程序就可以通过这个异常来处理数据冲突。
处理办法是,如果服务端已经不存在用户需要删除的原始数据,那么,只要将客户端的该条数据删除。如果用户是对该数据进行更改,可以先检测服务端的数据,看是否存在,倘若不存在,则通知用户,并视用户的操作无效,同时将本地的那条过期数据删除。
总结:
智能客户端技术是颇有前途的下一代客户端技术,它能够在有网络连接和网络断开的情况下灵活地工作。对用户而言,这将是新的一种软件使用体验,能同时拥有C/S模式软件快速的反应、丰富的用户界面体验和瘦客户端模式那样简单的部署,升级。对开发者而言,开发的难度变大了,考虑的方面多了,但还是有灵活的方案可供选择,还可以结合.NET技术,使用面向服务或面向数据的解决方案,在开发中,要着重解决“连接的管理”,“WEB服务的交互”,“本地数据缓存”和“数据冲突处理”的技术点。
|