Spring.net整合Asp.net mvc

出處:http://www.cnblogs.com/moye/archive/2008/11/30/1344369.html

既然提到mvc,就不得不說說微軟在asp.net上的一個重要創造——postback機制。
但凡用asp.net做web開發的人,都和這個機制打過交道吧。asp.net頁面aspx是其於這種自回發機制運轉的。
我們平時用到的web控件,諸如TextBox、Button等,無一不是基於postback進行封裝,在最終生成的html頁中,它們還是會被轉化成爲或者。
然後我們可以查看一下頁面的源文件代碼,會發現.net framework爲我們寫了不少東西:比如__doPostBack()這個js方法,用於提交窗體;WebForm_OnSubmit()方法會進行窗體的驗證;一個長長的__VIEWSTATE隱藏字段保存窗體上控件的狀態信息等(令人髮指)……等等。(詳述請參見種玉堂的《再認識asp.net的postback機制:探索__doPostBack的來龍去脈 》)。
多麼讓人又愛又恨的發明! postback確實方便了開發者,尤其是小型應用,手到擒來;但性能呢?不敢恭維!尤其那一長串__VIEWSTATE,每每看到,都覺得揪心。

所以,在項目中的前端表現界面,決定啓用mvc實現。
原來使用monoRail,感覺很好,但一直沒有解決與Spring.net整合問題;而後來乾脆聽說,monoRail已經停止維護這個項目,只得作罷。幸好,此時還有一個選擇——asp.net Mvc。
經過一段時間的嘗試,終於把它與Spring.net整合在了一起,這意味着,mvc能共享到Spring.net中的所有對象,無縫集成。

由於Asp.net Mvc是ASP.NET 3.5 Extensions Preview 的一個部分,能不能在IIS6+Asp.net 2.0 framework下良好運行,也一度讓人擔憂,可喜的是,網上很多人都這麼幹,並且成功了。也就是說,如果決定在.net 2.0下使用asp.net mvc(本實例使用的版本爲asp.net mvc Preview 4),除引用mvc的dll外(Microsoft.Web.Mvc.dll、System.Web.Mvc.dll等),還需額外的引用一個.net 3.5的dll(System.core.dll),此處提供這個包的下載:

Asp.net mvc preview 4 和 System.core.dll(v3.5):/Files/moye/Asp.Net_MVC_4.rar

簡單說,.net mvc將視圖(View)與控制器(Controller)進行了分離,表現與邏輯的關注點不再糾纏於一團。而Model的傳遞,微軟提供了一套DataDictionary(ViewDataDictionary、TempDataDictionary等)。同時,像monoRail一樣,.net mvc在頁面中也可以其於模板書寫表達式,比如:你可以在Controller中傳遞一個IList過來,這邊接收到對象拆箱後,循環迭代輸出一個行數等同的


關於asp.net mvc的詳盡原理,此處不累述,有興趣可參閱 亂世重典的《Asp.net Mvc Framework 系列》。

歐克,回到重點,說說整合的事:

以上圖示的結構:
將Controller單拿出來,做一個層,用以響應Web/Views中視圖的請求。整合的目標就是:讓這些Controller能夠被注入,運行於Spring.net容器中。

通過學習Fredrik Normén的經驗:《ASP.Net MVC Framework - Create your own IControllerFactory and use Spring.Net for DI 》,我們能知道,要創建自己的ControllerFactory,必須實現System.Web.Mvc的IControllerFactory接口。原型如(.net mvc Preview 4,版本不同接口也可能不一樣):

using System;
using System.Web.Routing;

namespace System.Web.Mvc
{
public interface IControllerFactory
{
IController CreateController(RequestContext context, string controllerName);
void DisposeController(IController controller);
}
}

在實現的CreateController方法中,將負責對不同的Views派發對應的Controller。這裏做一個假設,/Views目錄中有一個叫User的目錄,那框架就認爲,這是一個User視圖集合(具體表現在url上,如/User/home、/User/login等),應該有一個叫UserController的控制器對此目錄中的所有頁面進行響應。

歐克,實踐一把:

◆在Web的/Views創建一個web.config文件,並這樣配置(它的作用:接管對.aspx頁的請求流程):

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章