DbEntry MVC 开发小记

  花了一周左右的时间,使用 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] :)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 框架
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值