2007年12月23日

微软MVC+Linq开发的感受

作者 非鱼

为了了解一下微软的MVC框架,顺便学习一下LINQ操作,于是做了一个虚拟项目,也就是一套数据库管理工具,开始边查资料边动手干。

为了把对自己的系统环境的影响降到最低,以免影响日常的工作,使用虚拟机新装了一个Windows 2003(当然,装2008RC1也不错),然后装上Sql Server Express 2005,Visual Web Developer 2008 Express,安装这个东西的时候自动安装上了.Net 3.5,然后要下载Asp.net 3.5 Extension,因为MVC框架在这个东西里面,现在还不是正式版,只是个CTP预览版。

东西都装好了,打开VS,新建网站,发现没有MVC项目可以选。搜索了一下,原来MVC项目模板只支持VS的专业版及以上,不支持Express版,不过有人做了专门的模板文件,下载下来放到自己的项目模板目录就可以用了。

新建MVC项目之后,自动创建了一套目录结构,Default.aspx只是一个点位文件,里面没有内容。Global.asax里面是定义URL转换的过程。views目录下是aspx前台文件,也就是用于显示页面用的。Models和Controller部分都在App_Code目录里。默认情况下建了一个HomeController和一个Home模板文件,访问根目录的时候,就会自动转向该过程。

微软MVC的好处是,aspx文件仍然可以使用原来的MasterPage架构,在任意的地方(推荐是Views目录下)增加一个master文件,作为框架,在aspx页面里面的使用方式跟以前没有区别。

接下来到数据库里去建立数据库和数据库表,把表之间的外键关系设好,(否则LINQ不能自动生成一对多的关系)。另外,个人建议,把字段全部设成非空的。如果Int或者DateTime字段为空的话,那么Linq生成的类里面的数据类型就是int?和DateTime?,这样在使用这些字段的时候就会有些麻烦,需要判断是否为Null,还要用.Value来取值,完全没有必要。如果字段要求非空,那么DateTime字段的默认值是DateTime.MinValue,否则,默认值为空。

数据库表建好,关系也建好,就可以开始LINQ之旅了。回到VS界面,在models目录上点右键-新建,选择Linq to SQL classes,这时候需要把数据表拖到这个界面上。在VS的Database Explorer界面里建好到数据库的连接,然后展开Table,把一个个的表拖到左边的界面上就可以了。对于表中的外键,设计工具会自动建立一对多的关系。(这个地方只支持一对多,不支持多对多,比如User和Group之间的对应关系,一定需要一个中间的UserGroups类来做为关联,因为Linq to sql classes跟SQL之间的关系是完全一一对应的。)

所有的表都拖好,根据自己的需要对某些类和关系所生成的字段改名,只要一保存,数据库所对应的对象就已经建好了。接下来的工作就是建立你所需要的Controller,以及它所对应的View页面。比如要处理用户信息相关的内容,那么需要建立一个UserController.cs类,同时,在views目录下增加一个User目录。在UserController中增加一个带有[ControllerAction]属性的方法,在里面处理业务逻辑,然后传递给页面层(使用RenderView函数,参数为模板下面的文件名)即可,没有多余的步骤,也不需要配置哪个Controller对应哪个模板目录,一切都是自动的,一切都是必然的。

虽然整个项目的逻辑过程和架构跟Ruby On Rails或者Python的Django是非常相似的,但是因为强大的Visual studio的好处,加上在模板文件中要显示数据的时候可以直接拿到强类型的对象或者对象列表,因此,在aspx文件里面写代码的时候,可以享受到VS的自动提示和自动完成的好处,而且拥有编译时错误检查的能力。这种好处,在其它的语言和环境中是得不到的。

Linq的语法实在是让人比较头疼,目前现学现卖的算是把项目做出来了,但是不知道怎么处理一对多的查询,我只是查询出那个多对多的中间表,然后调用它里面的下级对象。但是目前我比较担心的是它的性能问题,不知道所取得的这个列表是如何处理它的下级对象的,是在我调用到的时候获取的吗?如果是这样的话,那性能可就太差了。但是我又没有找到类似Django里面的select_related()这样的强制一次性Load出所有关联对象的命令。这个要再查查资料或者跟踪一下数据库调用了。

总之,微软MVC所提供的开发过程是非常愉快的,我的整个开发过程,比使用以前的普通的asp.net开发方式要快了五倍以上,比Django要快两倍以上。但是,用Ruby On Rails和Django开发的时候,尤其是前期设计的时候,你所面向的完全是对象,先设计出你想要的对象结构,然后它自动帮你生成数据库结构。而在微软MVC中,则是先设计数据库,再由数据库生成相应的对象。虽然最后的结果差不多,但是其过程的优劣根本是天壤之别。

PS:网上的MVC教程都说如果在IIS7上面使用的话没有问题,在IIS6上面使用的话要在路径中加上.mvc这样的后缀名,否则IIS无法把这个请求发给.net处理器,因此就会产生虚拟路径下文件不存在的问题。实际上,这个问题也不是现在才产生的了,很早以前人们使用HttpHandler来生成虚拟静态URL的时候就有这个问题了,只要在IIS6的站点设置里面加上一个“通配符应用程序映射”就OK了,无需带上那个丑陋的mvc结尾,以免你的网站整个被搜索引擎忽略掉。