MVC3+EF4.1 构建高性能可伸缩的应用系统
郑重声明,如果引用,请注明出处:(原创 博客园:天之子)
MVC3+EF4.1 Web 应用程序已经是单页面框架结构,性能已经很优秀,我们的目的是打造优秀中的精品软件,所以,性能优化还是需要的。
我们从以下几个方面考虑构建系统:
一、调整代码结构
微软给出的结构已经很直白:Scripts(JS脚本)、Contents(主题以及CSS)、Controller(控制器)、Models(模型)、 Views(视图)等。MVC3 没有提供大量足够的开发组件给开发者,只是给出了 jQuery、jQuery UI 基础应用,给我们更多的是自由选择需要的 jQuery组件搭建我们的系统。
我在开发这套基本业务框架的时候,心里很郁闷、很纠结,找到非常适合的组件,融合进MVC3的扩展容器,不是一件容易的事情。经过一个月的时间,总结了一下应用系统的代码结构需要调整:
MvcApplication
Contents
css -------- 通用的样式文件,例如:site.css
form -------- 编辑窗口使用的操作按钮(保存、取消、删除等)小图标,源代码开发使用,设置为不生成内容
img -------- 使用 CSS Spirits 技术合并小图后的图片,例如:toolbar.png
themes -------- jQuery UI 主题,例如:base、ui-lightness
toolbar -------- 列表窗口使用的工具栏小图标,源代码开发使用,设置为不生成内容
Scripts
debug -------- 调试状态时的JS文件,例如:jquery-1.6.1.js、jquery-ui.js,设置为不生成内容
release -------- 发布状态时的JS文件,全部都是压缩过的版本,例如:jquery-1.6.1-min.js、jquery-ui-min.js
Toolkit
layout -------- 页面布局,jquery.layout.js、jquery.layout-min.js、layout-default.css等
menu -------- 不限级次的多层菜单,主界面使用
timepicker -------- 基于 jQuery UI 的日期时间控件
……
Template -------- 应用模板,例如:导出 Office 需要的模板。。。
Controllers
Models
Views
Shared -------- 布局视图,例如:_Footer、_Header、_Layout
Include -------- 包含视图,例如:_EditScript、_ListScript、_TreeScript、_Toolbar
……
上面只是MVC3 应用程序的代码结构,还有应用类库的结构,每个项目的业务不同,这里不多说了。
如果你用MVC3 做过应用系统,你可以看得出来,这种代码结构扩展了已有的结构。
1) 所有第三方组件全部归入 Toolkit 目录。
2) 脚本拆分为:调试和发布,管理起来要一个目录下的一大堆JS脚本清爽很多。设置正确,发布时直接运行,没有多余的文件。
3)多个视图都使用了同一个分部视图,那么归入 Include 视图。如果共用分部视图不多,也可以和 Shared 合并一起。
4)添加 调试、发布 版本标志,依据:Web.config/system.web/compilation.debug = true/false,包含CSS/JS脚本的分部视图,根据程序状态自动加载相关的原始/压缩文件。
二、进一步优化程序框架
01)CSS Spirits 合并小图标为一张大图,背景+定位+限制大小,显示小图标。
很多人合并小图的第一个目的就是:工具栏图标至少十几个,合并后使用一张大图,效率会提高一些。但是,尝试了很多次,基本上都是兴冲冲而去,垂头丧气放弃。为什么呢?原因就是怎么也用不上CSS Spirits,背景图不会用。
我有一篇文章就是讲怎么用 CSS Spirits 技术应用与工具栏的,请见CSDN技术专栏:MVC3 基本业务开发框架 0.6.20110530版本 更新日志(添加日期时间选择+带条件查询翻页+下拉工具栏) 。
原理就是:<a><span><img/>按钮文本</span>< /a>,图像和文本构成按钮整体,图片首先加载一张透明前景图,用合并大图作为图像的背景图(带图案),穿透了透明的前景图,显示给用户看起来就是 一张小图。
CSS Spirits 技术还可以用于许多地方:编辑窗口的按钮图标,主界面的图片背景等。
02)压缩 CSS 和 JS 脚本
如果你用过在线压缩 CSS 和 JS 脚本的工具,也就不难理解和找到许多这样的资源,充分利用吧,节省你的带宽。
这里,提供一个建议: 使用记事本,把 jquery.min.js 和 jquery-ui.min.js 内容先后复制进去,手动删除换行,压缩为一行,这个合并后的文件命名:jquery-1.6.1-ui-1.9m5.min.js,用合适的工具压缩后命 名:jquery-1.6.1-ui-1.9m5-min.js,应用到你的发布版本的程序中,两次请求=〉一次请求,是不是很好呢?如果你用的 jquery-ui-custom 自定义版本,字节数就更少了。
如果压缩JS文件,发现不能正常运行了,那么,可以很明确的告诉你:这个JS文件编写不规范,最大可能是行尾缺少“;”造成的! 不相信,你可以试试!百试百灵。我曾经在一个5-6千行的代码里面找到了几个“省略”的分号,添加上,再压缩,一次成功。
closure_packer_yui_compiler 压缩 JS 文件很准确,建议使用用来压缩JS。
有些CSS的压缩之后会破坏语法结构,造成不正常显示,必须小心!
03)优先使用分部视图+AJAX显示内容
如果一个网格包含工具栏,需要一些CSS+JS文件引用,那么建议:包含文件用分部视图,写入layout布局的header;工具栏提取为分部视图,便于将来调整;分页提取为分部视图,翻页时更新数据。
建议使用弹出页面编辑模式,用$.ajax请求控制器,用jQuery UI Dialog显示AJAX内容,数据量很小,显示速度极快。我做了三种框架:EXTJS、jQuery EasyUI、MVC3,MVC3 的单页面模式执行速度 >= jQuery EasyUI,占用内存最小,而且兼容IE 9,性能非常优秀。强烈建议程序员从 WebForm 网站程序 转到 MVC3 应用程序 中来,这是发展的趋势。
04)优先使用 linq+ORM
数据驱动的程序,都是把数据库作为主要的业务来处理的。模型驱动的程序,是用面向对象的角度思考解决问题。
ORM的实现方法和工具有很多,博客园有段时间都在口水战:NHibernate 和 EntityFramework 孰优孰劣?我们不管孰优孰劣,谁的性能最高,只要是适合够用的就是好。建议采用 EF4.1 Code First,其实就是代码优先的模型驱动。简单易用,非常适合MVC3 应用程序,都是微软一家子的东西,文档、实例一个都不少。
恐怕就需要我们一些同学转变思维方式:数据驱动=〉模型驱动=〉领域驱动。
linq 访问 DbContext,代码非常简洁,用过的人才知道。
要想讲清楚 怎么用好 linq+ORM,又是一个很庞杂的问题,展开来不是一篇或者几篇文字描述清楚的,这里干脆不讲了。
三、高性能运行结构
01)不用立即更新的页面内容,采用输出缓存。
例如: 主界面动态菜单,只要登录之后第一次加载,从数据库/配置文件读取,设置页面输出缓存,十分钟之内不用频繁访问数据库。
[OutputCache(Duration = 600, Location = OutputCacheLocation.Server, VaryByParam = "personCode")]
public JsonResult InitMenu(string personCode)
02)压缩清理输出代码。
如果输出类型= text/html,并且客户端浏览器支持 gzip / deflate 压缩,启动数据流压缩。
如果启用清理(默认),正则表达式替换 <!-- * --> 、/* */、// 等程序注释,清除回车前后空白、清除 >< 前后空白等。
要求输出纯净的HTML+JS脚本,不含任何注释、大块空白、版权等附加信息,注意正则表达式的验证。
03)禁止不用的视图引擎。
// 移除不用的视图引擎,只添加Razor
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());
04)解决方案配置为 Release 版本。
05)自动加载调试和运行版本的文件。
06)排除不发布的文件,发布的文件设置为生成内容。
07)启用IIS提供的GZIP压缩功能,目的是压缩并缓存外部 CSS、JS 文件。数据流压缩+IIS压缩,包含了内部+外部脚本的整体优化。