MonoRail的核心是Action Pack在.NET上的實現。 這種方式高效, 直觀而且易於測試。 MonoRail的開發模式和傳統的webform有很大區別, webform屬於PageController模式, 每一個頁面對應一個Controller, 通常情況下, 這個Controller就是根據url相對應的。aspx檔案分析出來產生的類。 如果不清楚aspx的底細, 請看這裡。 System.WebUI.Page實現了IHttpHandler, 每個aspx相關的類各自處理自己的http請求, 經一些邏輯處理後(通常代碼在aspx的Codebind類, 也就是aspx的父類), 輸出自己的視圖。
MonoRail是什麼?
是CastleProject的一個子項目. 在使用過Ruby On Rails後, 覺得非常棒, 他希望在享受ROR的開發模式的同時能使用大量現有的資源, 於是就用.NET寫出了一個Castle On Rails. 後來ror那邊有人抗議說, 把項目名字叫做xxx On Rails是侵權, On Rails不只是它字面上"快捷"的意思, 而是代表了他們的軟體開發哲學, 是專有名詞,於是hammett把項目改名成MonoRail了. 至2011年3月,最新版本為2.1RC版。
而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引擎套用的最大障礙.
沒有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. 邏輯和界面完全分離, 便於維護和測試.
大部分流行的aspnet控制項, 都有開源的js實現的替代品, 例如 HTML編輯器可以用FCKeditor, 日曆可以用JsCalendar, 還有TreeView, Menu之類的, 在sfnet都應該找得到比較好的項目. 至於datagrid, 用nvelocity的foreach循環足夠了. 其實webform只是入門容易,要精通的話它的成本是比精通xhtml + css + javascript的成本高得多的。我也用過兩年webform,但是我仍然不了解它的生命周期中大部分的步驟。。。。
越來越多了:) castle官方論壇的monorail有專門板塊用來展示。
現在monorail的版本是2.0版(2010-01-17正式發布),可以支持.net Framework 4.0的框架