起源
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有專門板塊用來展示。
版本說明
現在monorail的版本是1.030版 就是RC3,可以支援.net Framework 2.0的架構