DbEntry MVC 开发小记

作者分享了使用 DbEntry.Net MVC 对网站进行重构的心得,包括脚手架的运用、Controller 的设计原则、静态页面分页算法以及数据库迁移等方面的经验。
  花了一周左右的时间,使用 DbEntry.Net 的 MVC 把 [url=http://llf.hanzify.org]我的网站[/url] 重新设计了一下,同时也可以算是对 DbEntry.Net MVC 的一次实用性测试及升级。在这里记录一些感想。

  DbEntry.Net MVC 更像 Ruby on Rails,使用的脚手架方式也类似,以前我就觉得,脚手架是挺重要的,在这次开发中,也实际的感觉到脚手架的好处。事实上,直到现在网站已经上线运行,还有一些管理员功能是直接使用脚手架的。在敏捷开发中,数据Model可能随着开发进度的发展而发生变化,特别在开发初期,很多不确定因素会导致Model的变化,所以一个好的脚手架模块,应该是能尽量延迟其被实体化的时间,一旦其被实体化,数据Model的变化,就很可能导致这些代码的变化。所以,我觉得脚手架就不能是代码生成器,即使代码生成器可以作为“编译前事件”而做到每次Model的变化都得到表现,却很难判断是否用户修改过被生成的代码,用户修改过的代码被覆盖,会是一件很让人丧气的事。一般来说,Controller的脚手架代码不太需要修改,主要需要修改的是View,为了尽量增加脚手架View的生命周期,我为脚手架View增加了对于MasterPage的支持,虽然即使这样,脚手架的View看起来还是有些简陋,不过,至少是和整体网站的风格统一了,用户也可以看到和使用MasterPage里的链接,可以尽量等到Model之类的变量比较确定的时候,再加入定制的View。

  以前在 javaeye 的一个帖子 [url=http://www.iteye.com/topic/24499]ruby on rails为什么暂时无法成为企业应用开发的主流?[/url] 里讨论说 RoR 似乎鼓励所有的代码都写到一个 controller 里,比如 javaeye 的 blog 就只有一个 controller,我曾回贴说可能 XP 开发的话,是否只有一个 controller 也无所谓,当然,我现在也还是认为 XP 开发的话,确实可以在很大程度上改善这种情况,不过,在这次开发中,我却觉得,是否所有功能都写在一个 controller 里,更多的是一个设计问题。在开始的一两天里,我确实也把很多功能都放在了 ArticleController 里,article/rss, article/category 等也看起来挺顺的,但是,它把 rss, category 的代码混入了 article,而只要改变为 rss/article 和 category/show,它的代码就被放在了另外一个 controller 里,而且,职责也更清晰,对 RssController 来说,支持 rss/comment 也更理所当然了。

  在这次网站的设计中,我第一次大量使用了 Static Page 方式。这是以前我为 DbEntry 设计的一个用于分页的算法,其源于使用搜索引擎的郁闷。很多时候,我们搜索一个东西,搜索引擎显示其链接,等我们点击进去后,却发现我们所在分页根本就没有我们要查的信息。原因在于,只要有新的文章不断加入,常用的分页算法对于特定文章的 PageIndex 将会发生变化,比如最早的文章,将会随着新文章的加入,而逐渐变为第二页、第五页、第二十八页……。而解决这个问题的方法,就是类似动态页面静态化的想法,最早的文章不应该是80页、90页,而总应该是第1页,最新的文章才应该是80页、90页。静态分页有一个问题,就是包含最新记录的页面可能不到 PageSize 那么大,如果显示在首页的位置,有时候会显得比较单薄,所以,在这次开发中,我增加了 Hybird 方式,首页使用传统分页,之后使用静态分页。

  说是网站重新设计,在于以前的数据库结构完全放弃了,在这次开发中 Model 完全由构想的使用方式决定,而跟老的数据库结构关系不大,比如,老的数据库结构是固定两层 Category,有 topic,有 keyword,而在新的数据库结构中,只有一层 Category,而把以前的第二层 Category 和 topic、keyword 都作为 Tag 处理。这当然导致数据库迁移显得比较麻烦,使用 DbEntry 的 BulkCopy,在一定程度上缓解了这个矛盾,对于 BulkCopy 来说,需要编写的是针对源数据库的 SQL 语句,目标数据库的 SQL 语句是由 BulkCopy 自动根据目标数据库类型生成的,所以我仍然可以使用一份代码,从源数据库生成 sqlite 数据库用于开发,生成 Firebird 数据库用于部署。不过,因为 Firebird 使用的是序列方式产生主键,而 BulkCopy 不涉及 ORM,所以它不会去操作序列,虽然不需要像 Sql Server 插入主键那样调用 SET IDENTITY_INSERT ON,但是却需要在导入数据后,重新设置序列,以便其能正确的产生主键,我使用的方法可能笨一点儿,就是用 max(id) 取得最大 id 值,再多次调用 select 去取相关序列,反正速度挺快的,应该也不需要多聪明的方法吧。不过也发现在 Firebird 上用 ExecuteNonQuery 调用 select 取序列的话,根本不会执行......

  网站的 footer 上,写上 Powered By DbEntry.Net,感觉挺爽的,考虑稍微修改一下许可协议,如果有项目要使用 DbEntry.Net 的话,也要在经常能见到的地方写上 Powered By [url=http://dbentry.codeplex.com]DbEntry.Net[/url] :)
DbEntry.Net是作者(梁利锋)设计的一个轻量级的 .Net ORM (Object Relational Mapping) 数据访问及 WEB 框架。对于 ORM 和 Sql 调用,它都拥有清晰和易用的 接口,目前支持 SqlServer、SQLite、MySql、Access、Firebird、Oracle 等数据库。对于 WEB 开发,它既支持 ASP.NET 2.0 的 DataSource 方 式,也支持 Ruby On Rails 风格的 MVC 方式。   目前,数据库部分已经支持多主键、多表联合查询、快速分页集合、 隐式数据库事务、连贯API查询、ActiveRecord风格查询、动态对象、部 分保存、自动创建数据表、一对一、一对多、多对多关系等功能,具体 实现请参阅 Samples 中的例子程序和单元测试的内容。   而 DataSource 部分,因为绑定数据访问组件,所以可以只需要修 改配置文件,不需要修改任何代码的在不同的数据之间切换。另外,还支 持按命名约定的方式绑定“新建”和“编辑”页面的控件,以最少的代码 完成输入、验证、保存等一系列操作。   Rails 风格的 MVC 框架目前已经完成 MVC 部分,脚手架,基类中 的 LinkTo、UrlTo 等快捷函数,Http Get 支持等。目前脚手架部分没有 数据验证模块,不过,自己写的 MVC 代码可以自行实现验证。   这个版本中,例子程序访问的数据库主要是 Access,而单元测试使 用的数据库是 SQLite,通过修改配置文件中数据源部分,可以使之不需 要重新编译即可工作于其它数据库上。配置部分通过 App.config 进行, 请参阅 Samples 中的例子程序中的 App.config 和 UnitTest 项目内嵌 的配置文件 UnitTest.config.xml 。   作者在 MS Sql Server 2000、MS Sql Server 2005 Express、 MS Access 2003、MySql 5.0、SQLite 3、Firebird 2.0.3 和 Oracle 10g Express 上测试过本组件。   v0.33 版比较大的改变为:   ·支持移除一对多、多对多关系   ·支持 Firebird、Oracle   ·增加缓存系统   ·支持 SoftDelete、CreatedOn、UpdatedOn   ·支持 ASP.NET 2.0 Membership 系统   ·DataSource 支持“新建”和“编辑”页面   ·Rails 风格 MVC 框架
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值