相对于不同的需求,网站的大小,开发复杂度,成本,网站的架构也分许多种。
大多数小型网站,需求较为简单,安全性要求不高,开发时间短。一般这样的网站,还会有一个与数据库之间的交互。用Asp.Net中提供的控件,完全可以满足开发的要求。一般的架构如下图所示:
表示层通过数据源控件如SqlDataSource+数据控件如GridView就可以直接与数据库之间进行CRUD操作,优点是简单,快捷。但缺点是不够灵活,对稍复杂的业务无法满足需求,而且所有数据操作都写在页面中,不但影响传输速度,也不够安全。
于是一些操作可以用ADO.Net+DataSet/DataReader完成,可将这些数据访问的代码写在App_Code或后台代码中,当数据访问写在一个类里时,就可以用ObjectDataSource控件引用这些方法,并且这个控件接收各种类型的参数,符合OO的思路。同时也可以手写操作DataSet数据表,DataSet相当于存储在内存中的数据库,内部含有DataTable二维表,根据数据写入的表名与字段名进行操作。DataSet有其优势所在,我们可以像对待数据库一样对它进行操作,而且类型化后的DataSet也能获得智能感知,排序,过滤的功能,并且可以对它进行序列化,这些特性使它在基于桌面的智能客户端应用程序大有作为。但是相对于Web应用程序来说,它还是有很大的局限性的:由于它是驻留在内存中的小型数据库,所以需要一定的系统开销,若只需要传递一行数据,仍需要创建与传递一个完整的DataSet/DataTable;数据表现形式很差,不够清晰友好;并且要添加自定义的业务验证逻辑非常困难。所以,下文将要出现的实体类更好的解决了DataSet的不足之处。
上述的这种架构设计无法应对需求的变化,耦合性过强,复用性差,无法多人同时开发。于是出现了经典的三层:数据访问层,逻辑层,表示层。PetShop就是这样的架构:
最大的变化是采用实体类替代DataSet,这个实体类基本上是与数据库表字段一一对应的关系,也会根据业务需求进行增添属性,这就做到了简单的数据持久化,而且表现形式明了,可以用智能感知,加强了OO,占用较少的内存。数据访问层只用ADO.NET与数据库间进行CRUD操作,返回了数据实体或泛型集合。逻辑层写一些业务逻辑需求的方法(不过PetShop的业务层只是一个摆设而已),调用数据访问层的方法与数据,将业务逻辑的处理与数据访问分开,逻辑清晰,并且当一部分业务变化时,并不会影响到数据访问层。表示层时最终用户看到的地方,表示层不与DAL相联系,它调用BLL的方法,并且会有后台代码进行与页面操作相关的处理,如数据验证、事件等操作。而在数据库中,会有一些存储过程供DAL调用。这样下来的话,整个Web应用程序便于合作开发,方便维护,复用,结构清晰。每层都会有每层独特的应用。三层也有许多演变,但万变不离其宗,目的都是做松耦合的结构,使系统达到可扩展,可复用等优点。
那么这里就有一个思考了,既然实体类是做数据持久化的第一选择,而且它是与数据表中的字段一一对应的关系,那么就可以做一个工具将建好的数据库中的表直接生成实体类,开发人员只需要将精力投入在业务逻辑上,不再需要去写大量的不易调试、维护的Sql语句与存储过程(有存储过程即会有逻辑,将逻辑处理放在数据库中就没有了OO),所以这就产生了ORM(对象关系映射),它抛弃了存储过程与ADO.NET,将数据库映射为实体类并写好了CRUD操作,开发人员只用调用它的方法进行如Insert、Update等操作即可。目前最流行的第三方工具是nHibernate,再利用代码生成工具生成Entity与.hbm文件,可以很快建成一套ORM体系,但它是利用反射获取数据的,就会有20%的性能损失,这相对于它所带来的便利,基本可以忽视了。ORM的流行,微软也在寻找自己的ORM,.Net3.5内的LINQ是一个轻量级的ORM框架,而之后号称ADO.Net 2代的ADO.NET Entity Framework是更成功的ORM解决方案,再加上LINQ TO ENTITY的帮助,已在事实上为微软的追随者们指了一条光明大道。个人认为,以理解nHibernate工作原理为辅,学习ADO.NET Entity Framework为主。但是对于还在VS05时代的人,nHibernate只能成为必选了。
这里顺带说一下,随着让开发人员更多的关注业务逻辑上的开发,出现了一条完全针对业务开发的架构分支---领域模型驱动设计(DDD)(有又一个从Java那边搞过来的东西)。以前我们所有的设计都是先建立数据库,然后再根据数据库写代码,也就是数据表驱动设计。而DDD得做法是先编写持久化类和映射文件,然后使用SchemaExport工具等生成数据库架构。当在设计时,我们的领域模型需要改变,只需修改NHibernate结构和应用程序,不需要修改数据库架构,只要利用SchemaExport工具重新生成数据库架构就可以了。当然DDD的架构在.Net应用的还很少,不过在Java国如火如荼的名词势必也会烧到.Net国的。
而后,网站开发因为MVC得影响(包括Java内的早已成熟的Struct、Spring MVC框架的影响),ASP.NET3.5也推出了MVC模板框架(目前已经退出1.0正式版,代码将会开源的形式放出,并且有类似PetShop的采用此框架Oxit博客系统开源可以学习)。Model,View,Conntrol其实更多的是真正解决与界面分离,ASp.NET MVC没有后台代码,没有事件驱动,它有更清晰的职责分离,更方便的单元测试。
Controller与用户进行交互,调用Model,选择View返回;Model进行数据存储、持久化;View展现页面。ASP.NET MVC相对于传统的Web Forms还不够成熟,它更适用于大型的Web开发。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明