MonoRail - 简介 [基础知识篇]
MonoRail - 簡介
起源
MonoRail是一個.NET的MVC web開發(fā)框架, 原名Castle On Rails, 是CastleProject的一個子項(xiàng)目. 作者h(yuǎn)ammett在使用過Ruby On Rails后, 覺得非常棒, 他希望在享受ror的開發(fā)模式的同時能使用大量現(xiàn)有的資源, 于是就用.NET寫出了一個Castle On Rails. 后來ror那邊有人抗議說, 把項(xiàng)目名字叫做xxx On Rails是侵權(quán), On Rails不只是它字面上"快捷"的意思, 而是代表了他們的軟件開發(fā)哲學(xué), 是專有名詞... 于是hammett把項(xiàng)目改名成MonoRail了. 現(xiàn)在可下載的版本是0.4beta, svn上的版本已經(jīng)是RC1了
簡介
MonoRail的核心是Action Pack在.NET上的實(shí)現(xiàn). 這種方式高效, 直觀而且易于測試.
MonoRail的開發(fā)模式和傳統(tǒng)的webform有很大區(qū)別, webform屬于PageController模式, 每一個頁面對應(yīng)一個Controller, 通常情況下, 這個Controller就是根據(jù)url相對應(yīng)的.aspx文件分析出來產(chǎn)生的類. 如果不清楚aspx的底細(xì), 請看這里. System.WebUI.Page實(shí)現(xiàn)了IHttpHandler, 每個aspx相關(guān)的類各自處理自己的http請求, 經(jīng)一些邏輯處理后(通常代碼在aspx的Codebind類, 也就是aspx的父類), 輸出自己的視圖. 而MonoRail是FrontController模式, 由Castle.MonoRail.Framework.MonoRailHttpHandler接管所有請求,?然后根據(jù)請求的url創(chuàng)建相應(yīng)的controller, controller再調(diào)用相應(yīng)的action, 最后調(diào)用模板引擎輸出內(nèi)容. 默認(rèn)情況下, 一個url的結(jié)構(gòu)是Controller/action. 例如, http://localhost/monorailSample/Home/index.rails對應(yīng)類HomeController的Index()方法.
MonoRail實(shí)現(xiàn)的模板引擎有3個
AspNetViewEngine 用傳統(tǒng)的.aspx文件做模板, 可以照常使用aspx語法和服務(wù)器控件, 但是由于Webform的生命周期和MonoRail完全不同, 有時候會讓人覺得別扭, 有部分特性也受到了限制.
NVelocityViewEngine 用NVelocity做模板引擎, 需要學(xué)習(xí)VTL語法, 但是使用很簡單, 特別是很多java程序員已經(jīng)熟悉velocity. 簡單的語法也強(qiáng)迫程序員把邏輯和界面很好的分離開來, 方便跟美工配合.
BrailViewEngine 基于Boo的模板引擎, Boo是一種語法類似python的.NET語言, 據(jù)MonoRail的參考說, Brail引擎是功能最強(qiáng), 性能最好的選擇, 但Boo是一種陌生的語言, 這成了Brail引擎應(yīng)用的最大障礙.
綜合各種因素, MonoRail推薦使用的模板引擎是NVelocity, 但說不定哪天Brail會趕上來...
沒有Server Control的世界
五花八門的Server Control是似乎是asp.net最吸引人, 最有優(yōu)勢的地方. Webform確實(shí)是一個非常棒的設(shè)計. 復(fù)雜的HTML和js在服務(wù)端被包裝成簡單易用, 有清晰層次結(jié)構(gòu)的對象, 比起asp時代界面的編寫方便多了. 當(dāng)初想用monorail只是出于方便和美工配合的考慮, 并且擔(dān)心是否有些工作又回到asp時代的原始狀態(tài). 但事實(shí)上, 我用monorail花了一個星期做了一個小項(xiàng)目后, 發(fā)現(xiàn)代碼是多么的簡潔和清爽, 代碼量比傳統(tǒng)的Webform開發(fā)少多了. 總結(jié)一下monorail效率如此之高的原因:
1. SmartDispatcherController提供了querystring或form到action參數(shù)的綁定, 支持string, 各種數(shù)值類型, 數(shù)組以及HttpPostedFile. 例如, EditUser.rails?id=1, 1將會綁定到EditUser(int id)方法的id參數(shù).?參數(shù)還可以綁定到一個對象, 例如一個form里有name屬性和User類各個字段名對應(yīng)的input, 當(dāng)他們post到SaveUser.rails時, SaveUser([DataBind]User user)中的user將會自動被創(chuàng)建和賦值. 一個業(yè)務(wù)邏輯比較簡單的MIS, 或許相當(dāng)一部分的代碼就是這樣無聊的:
paramName.Value = txtName.Text ; paramBirthday.Value = txtBirthday.Text.Length >0? DateTime.Parse(txtBirthday.Text) : DBNull.Value ; ...但是有了自動綁定機(jī)制后, 無聊的代碼就消失了,? 這也顯得TextBox, DropdownList之類的簡單server control沒有什么價值了.
2. 可以定義Filter, 在action之前和/或之后執(zhí)行, 在Filter里可以獲得action相關(guān)的上下文, 如果是在action之前執(zhí)行還可以通過返回false終止action的執(zhí)行. Filter可以用于權(quán)限驗(yàn)證, 日志, 生成公有的動態(tài)內(nèi)容等方面, 提高了邏輯代碼的復(fù)用.
3. 模板可以嵌套, 或者在Controller里定義LayoutAttribute使模板被嵌套, 并且引入了概念有點(diǎn)類似user control的ViewComponent, 提高了界面的復(fù)用.
4. 邏輯和界面完全分離, 便于維護(hù)和測試.
大部分流行的asp.net控件, 都有開源的js實(shí)現(xiàn)的替代品, 例如HTML編輯器可以用FCKeditor, 日歷可以用JsCalendar, 還有TreeView, Menu之類的, 在sf.net都應(yīng)該找得到比較好的項(xiàng)目. 至于datagrid, 用nvelocity的foreach循環(huán)足夠了. 其實(shí)webform只是入門容易,要精通的話它的成本是比精通xhtml + css + javascript的成本高得多的。我也用過兩年webform,但是我仍然不了解它的生命周期中大部分的步驟。。。。
應(yīng)用案例
越來越多了:) castle官方論壇的monorail有專門板塊用來展示。
轉(zhuǎn)載自:http://www.cnblogs.com/yok/archive/2005/11/05/269383.html轉(zhuǎn)載于:https://www.cnblogs.com/xyzla/articles/2728527.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的MonoRail - 简介 [基础知识篇]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以ThreadStart方式实现多线程
- 下一篇: php代码规范说明文档