2006/10/14 | asp.net程序编程模式
类别(编程开发) | 评论(0) | 阅读(46) | 发表于 19:51

首先asp.net应用程序是三层结构的,表示层 - 业务层 - 数据访问层,这个是大家经常采用的模式,但我在层之间加了些处理,主要是处理层与层之间的数据传输。下面是每层详细的内容。

业务层是一种业务逻辑的体现,与表示层无关,一般是一个类,包含业务的数据及相应的各种业务操作。业务层一般不直接调用数据访问层,而是通过一个数据访问服务类AccessService来调用,这样的话,数据访问层必须实现一定的接口IAccess(操作有LOAD,INSERT,UPDATE,DELETE)。当业务类要加载数据的时候,先把类的数据(一般是参数)打成一个包,然后调用AccessService的LOAD方法来调用数据访问层IAccess的LOAD操作,IAccess把数据从数据库读取出来,在打成个包,返回给AccessService,在返回给业务层,业务层把数据包解包后,数据变成业务层的数据(就是业务类的属性)。到这时完成业务数据的加载。之后在做相应的业务操作,在把数据打成包丢给AccessService处理,保存到数据库中。

为什么在业务层和数据层中间在加入一个AccessService,目的是为了降低层之间的偶合度,就是业务层和数据层无之间关联,数据层只是负责把数据永久化,与具体的业务也无关。如果要改动数据库类型,只要变动数据层就好了。

另数据层也不是直接访问数据库的,而是通过一个通用的DataServiceForSqlServer(SQL SERVER数据库的数据访问类),这个很多人都有的,就是些基本的操作,如ExecuteNonQuery、ExecuteDataSet、ExecuteReader 等。

asp.net采用界面很代码分离的方式来实现的,很多从asp转向asp.net都习惯把代码写到aspx文件里面,或者某些方法还是采用asp的方式,那是不可取的。asp.net采用ViewState的机制来实现页面内状态的延续。大家知道WEB是无状态的,就是说当一个页面加载完成后,所有的页面对象将被丢弃,以HTML的方式把数据返回给浏览器。当浏览器发出请求,服务器根据请求,创建各种对象,处理对象,在把数据以HTML的方式返回给浏览器,所以说页面是无状态的,服务器根本不知道页面的上一个状态是什么。asp.net则采用VIEWSTATE来让服务器知道前一个页面的状态。这里说的页面都是同一个页面。asp.net一般把一种功能放在同一个页面,而asp一般都要采取多页的方式。

那么在asp.net,是怎么实现状态的延续的?这个要了解下ASP.net控件的生命周期(PAGE类也是个控件类)。当浏览器发出第一次请求,服务器做了如下的工作:

  Init 初始化(创建控件树等初始化工作)
  LoadViewState 加载视图状态(因为第一次,这时视图状态为空)
  LoadPostData 处理回发数据(就是表单数据,因为在server,控件是以WEBCONTROL存在的,这时把表单的数据转换成控件的数据)
  Load 加载 (这里你可以编写你自己的初始化工作)
  RaisePostDataChangedEvent 发送回发更改通知(引发更改事件以响应当前和以前回发之间的状态更改)
  RaisePostBackEvent 处理回发事件(处理引起回发的客户端事件,并在服务器上引发相应的事件。如button的onClick事件是这时处理的)
  PreRender 预呈现(在呈现输出之前执行任何更新。如果在这个事件后面调用任何对WEBCONTROL或VIEWSTATE的更新都将会丢失)
  SaveViewState 保存状态(就是把当前的页面状态保存下在)
  Render 呈现(生成呈现给客户端的输出,就是以HTML的方式返回给浏览器,其中的视图状态的数据以隐藏表单的方式保存,名称为“__VIEWSTATE”)
  Dispose 处置(执行销毁控件前的所有最终清理操作)
  UnLoad 卸载

费了一大对口舌讲上面的东西,目的只是弄清楚asp.net的机制。

接来说说表示层。表示层只做简单的数据验证和时间处理,不处理业务,而由业务层处理。在第一次加载的时候,将创建与页面有关的业务对象,并把数据绑定到界面的webcontrol,完成数据的加载。这个有两种方式,一种把这个业务对象也以视图的方式保存起来,并修改数据,等发出保存处理命令在提交到数据库;另在发出保存处理命令后在创立原来的业务对象,在修改数据提交到数据库。前者可以减少数据库访问的次数,都由于对象保存在VIEWSTATE(这里有个序列化的问题),每次服务器和客户端往返的数据较多。

表示层的一个业务事件一般可以到业务层的一个业务操作,这样表示层就不用管具体的业务是怎么是实现的。另我在中间还做了个处理,就是这么把表单的值赋到业务类的属性去(就是把值转化为业务数据,中间还有个数据类型转化的问题)。我是通过BinderReflectService 的服务,实现转化的,大概是怎么实现的:在业务类有个BinderMappingCollection 对象,记录业务类的属性名称,以及相关的控件名称,BinderReflectService会自动获取控件的数据,并赋值给指定的属性。

0

评论Comments