MonoRail - 簡介
起源
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屬于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循環足夠了. 其實webform只是入門容易,要精通的話它的成本是比精通xhtml + css + javascript的成本高得多的。我也用過兩年webform,但是我仍然不了解它的生命周期中大部分的步驟。。。。
應用案例
越來越多了:) castle官方論壇的monorail有專門板塊用來展示。