起源

​MonoRail​​​是一个.NET的MVC web开发框架, 原名Castle On Rails, 是​​CastleProject​​​的一个子项目. 作者hammett在使用过​​Ruby On Rails​​后, 觉得非常棒, 他希望在享受ror的开发模式的同时能使用大量现有的资源, 于是就用.NET写出了一个Castle On Rails. 后来ror那边有人抗议说, 把项目名字叫做xxx On Rails是侵权, On Rails不只是它字面上"快捷"的意思, 而是代表了他们的软件开发哲学, 是专有名词... 于是hammett把项目改名成MonoRail了. 现在可下载的版本是0.4beta, svn上的版本已经是RC1了

简介

MonoRail的核心是​​Action Pack​​在.NET上的实现. 这种方式高效, 直观而且易于测试.

MonoRail的开发模式和传统的webform有很大区别, webform属于​http://www.microsoft.com/china/MSDN/library/architecture/patterns/esp/DesPageController.mspx">​PageController​​​模式, 每一个页面对应一个Controller, 通常情况下, 这个Controller就是根据url相对应的.aspx文件分析出来产生的类. 如果不清楚aspx的底细, 请看​​这里​​​. System.WebUI.Page实现了IHttpHandler, 每个aspx相关的类各自处理自己的http请求, 经一些逻辑处理后(通常代码在aspx的Codebind类, 也就是aspx的父类), 输出自己的视图. 而MonoRail是​​FrontController​​模式, 由Castle.MonoRail.Framework.MonoRailHttpHandler接管所有请求, 然后根据请求的url创建相应的controller, controller再调用相应的action, 最后调用模板引擎输出内容. 默认情况下, 一个url的结构是Controller/action. 例如, http://localhost/monorailSample/Home/index.rails对应类HomeController的Index()方法.

MonoRail实现的模板引擎有3个

AspNetViewEngine

用传统的.aspx文件做模板, 可以照常使用aspx语法和服务器控件, 但是由于Webform的生命周期和MonoRail完全不同, 有时候会让人觉得别扭, 有部分特性也受到了限制.

NVelocityViewEngine

用NVelocity做模板引擎, 需要学习​​VTL​​语法, 但是使用很简单, 特别是很多java程序员已经熟悉velocity. 简单的语法也强迫程序员把逻辑和界面很好的分离开来, 方便跟美工配合.

BrailViewEngine

基于​​Boo​​的模板引擎, Boo是一种语法类似python的.NET语言, 据MonoRail的参考说, Brail引擎是功能最强, 性能最好的选择, 但Boo是一种陌生的语言, 这成了Brail引擎应用的最大障碍.

综合各种因素, MonoRail推荐使用的模板引擎是NVelocity, 但说不定哪天Brail会赶上来...

没有Server Control的世界

五花八门的Server Control是似乎是asp.net最吸引人, 最有优势的地方. Webform确实是一个非常棒的设计. 复杂的HTML和js在服务端被包装成简单易用, 有清晰层次结构的对象, 比起asp时代界面的编写方便多了. 当初想用monorail只是出于方便和美工配合的考虑, 并且担心是否有些工作又回到asp时代的原始状态. 但事实上, 我用monorail花了一个星期做了一个小项目后, 发现代码是多么的简洁和清爽, 代码量比传统的Webform开发少多了. 总结一下monorail效率如此之高的原因:

1. SmartDispatcherController提供了querystring或form到action参数的绑定, 支持string, 各种数值类型, 数组以及HttpPostedFile. 例如, EditUser.rails?id=1, 1将会绑定到EditUser(int id)方法的id参数. 参数还可以绑定到一个对象, 例如一个form里有name属性和User类各个字段名对应的input, 当他们post到SaveUser.rails时, SaveUser([DataBind]User user)中的user将会自动被创建和赋值. 一个业务逻辑比较简单的MIS, 或许相当一部分的代码就是这样无聊的:

paramName.Value = txtName.Text ;
paramBirthday.Value = txtBirthday.Text.Length > 0 ? DateTime.Parse(txtBirthday.Text) : DBNull.Value ;
...

但是有了自动绑定机制后, 无聊的代码就消失了,  这也显得TextBox, DropdownList之类的简单server control没有什么价值了.

2. 可以定义Filter, 在action之前和/或之后执行, 在Filter里可以获得action相关的上下文, 如果是在action之前执行还可以通过返回false终止action的执行. Filter可以用于权限验证, 日志, 生成公有的动态内容等方面, 提高了逻辑代码的复用.

3. 模板可以嵌套, 或者在Controller里定义LayoutAttribute使模板被嵌套, 并且引入了概念有点类似user control的ViewComponent, 提高了界面的复用.

4. 逻辑和界面完全分离, 便于维护和测试.

大部分流行的asp.net控件, 都有开源的js实现的替代品, 例如HTML编辑器可以用​​FCKeditor​​​, 日历可以用​​JsCalendar​​, 还有TreeView, Menu之类的, 在sf.net都应该找得到比较好的项目. 至于datagrid, 用nvelocity的foreach循环足够了. 唯一缺的就是ComponentOne, Infragistic等大厂家做的那一类商业表格. 但是不要忘了, 还有AspNetViewEngine可以用, 如果你还觉得它不爽的话, 这一部分用回webform又有何不可?

应用案例

目前只知道一个: ​www.viavirtualearth.com/">​www.viavirtualearth.com​