现在的位置: 首页 > 综合 > 正文

2004-12-28 + petshop3和duwamish7的对比

2011年12月10日 ⁄ 综合 ⁄ 共 2007字 ⁄ 字号 评论关闭

petshop3.0和duwamish7是ms给出的两个关于.net b/s开发的经典示例,今天我把这两个示例放在一起,用我现在所掌握的知识来比较一下。

1.系统架构
2.数据访问
3.业务逻辑
4.web表示
5.辅助操作

1.系统架构
首先一眼就可以看出,两者都使用了层模式来构建各自的系统,使用了数据层/业务逻辑层/表示层 这样经典的三层模式。但是每个又都有所扩展。
petshop这里的数据层使用了工厂模式来构造了一个可以任意添加数据访问组件的系统。通过工厂,你可以方便的更改你需要的数据访问策略而不用改动系统的其他部分。在ms的示例中就给出了sqlsever/oracle两个数据访问方法,如果需要,你可以添加你自己的数据访问组件,比如写一个对应access的,或是把原有的sqlserver的重写。
而duwamish这里则使用了facade模式把业务层变成了businessfacade/businessrules两部分,目的是为了降低逻辑操作的复杂度,增加业务层的可维护性,并把内部的复杂逻辑处理隐藏起来,对外提供一个统一的接口。通过学习duwamish实例,可以看到有些操作是这两个层协作完成,有些操作则只需要businessfacade层。我们可以想到,如果把需要两个层协作完成的任务放到一个层,那将产生一个多么复杂的逻辑处理组件。分两层的优点由此可见一斑。
2.数据访问
抛开一些特殊的因素来看两者的数据访问策略。petshop是使用了轻量化的datareader,而duwamish则使用了可操作性更高的但更复杂的dataset。
petshop使用datareader的目的很明显,就是追求轻量化和高效率。因为datareader本身没有提供任何对数据处理的方法,所以p采用了一个sqlhelper组件来辅助进行数据访问。这个sqlhelper其实就是自己重写的data access application block for .net(ms提供的一个数据访问组件,可以在msdn上获得)。但是datareader并不适合在层间传递数据,所以为了方便数据访问,petshop特意定义了一组model类,这些类就是所谓的业务实体。通过datareader/sqlhelper/model的配合,实现了包括事务处理在内的复杂的数据访问。
duwamish使用的是介于强类型dataset和普通dataset的一组特殊的dataset来实现数据访问。借助于dataset强大的数据操作能力,duwamish轻松的实现了包括错误处理在内的数据操作。另外dataset的结构也为远程化操作提供了方便。但是应该看到,使用这种特殊的dataset的缺点就是太复杂,另外系统性能也会受影响。
3.业务逻辑处理
业务逻辑处理方面,petshop使用了一个业务层来完成,因为其展示的逻辑处理比较简单(毕竟只是一个示例),而duwamish则采用了facade模式以应付复杂的逻辑处理。
petshop的业务层主要用来使用工厂。在其内部使用工厂返回的数据层组件接口来间接的调用数据访问组件,完成相应的操作。业务层并不知道自己到底调用了什么样的数据访问组件,具体数据访问是怎么实现,由工厂来决定。
duwamish的业务层对外展示为businewwfacade,在需求传过来时,再根据具体需要,或是直接调用数据访问组件,或是把需求再传给businessrules。其内部的操作很复杂,但是对外接口却是简单统一的。
4.web表示
表示层的作用为提供用户操作界面,调用业务层处理用户请求。petshop和duwamish的表示层也不例外的履行了这些职责。但是petshop的操作是集中制的,而duwamish则采用模块化。
在petshop里有个processflow,是为处理复杂的逻辑操作准备的。在分散的各个页面,如遇到相应的请求,则该页面直接调用processflow处理,在processflow内部再调用业务层。processflow将复杂的操作隐藏了起来,使相应页面上的处理简单化。如果是遇到简单处理,则各页面自行解决,并不需要processflow参与。
duwamish的各个页面基本上都是由用户控件组成的,这些控件不是简单意义上的用户控件,而是封装了逻辑操作在里面。当用户请求某种操作时,对请求的处理并不是在响应的页面,而是用户控件取得请求并调用业务层组件进行处理。这样各种业务处理就分散在这些模块中,而遇到复杂请求的时候,再由页面通过整合这些模块的处理数据来做进一步处理。
5.辅助操作
对包括设定的读取、错误处理、数据处理等一些操作的完成,两者都采用了提供工具类的方法实现。这些工具类活跃于系统的每个角落,增加了编程的灵活性,降低了系统的耦合度。

大体就这些,本来还想把两者一些值得学习的地方些出来,不过刚才一想,那应该是另一篇了吧。今天就到这里了 :)

【上篇】
【下篇】

抱歉!评论已关闭.