13個 ASP.NET MVC 的擴展

ASP.NET MVC設計的主要原則之一是可擴展性。處理管線(processing pipeline)上的全部(或大多數)東西都是可替換的。所以,若是您不喜歡ASP.NET MVC所使用的約定(或缺少某些約定),您能夠建立本身的服務來支持您的約定,並將其注入到主管線中。html

在本文中,咱們將從管線開始直到視圖呈現,逐一貫您展現每一個ASP.NET MVC開發者都必須瞭解13個擴展點。正則表達式

1.ASP.NET MVC擴展之RouteConstraint數據庫

一般狀況下你可使用正則表達式對url參數進行約束,但若是您的約束不只僅取決於單一參數,您能夠實現IRouteConstrains的方法,並在其中添加你的驗證邏輯。數組

好比對日期的驗證,url中可能會包含年、月、日,而你須要驗證這三者是否能夠組合成一個有效的日期。瀏覽器

2.ASP.NET MVC擴展之RouteHandler框架

RouteHandler是在路由選擇以後進行處理的組件,它並不只僅針對ASP.NET MVC。顯然,若是您改變了RouteHandler,那麼對請求的處理將再也不使用ASP.NET MVC,但這在您使用其餘HttpHandler或經典的WebForm進行路由處理時倒是很是有用的。ide

3.ASP.NET MVC擴展之ControllerFactory函數

ControllerFactory是基於路由的組件,它選擇正確的controller並對其實例化。default factory會查找實現了IController而且以Controller結尾的類,而後經過反射使用無參構造函數進行實例化。post

但若是您但願使用依賴注入,就不能再使用default factory,而必須使用支持IoC的controller factory。MvcContrib和Ninject Controller Factory都包含支持IoC容器的controller factory。學習

4.ASP.NET MVC擴展之ActionInvoker

ActionInvoker顧名思義是負責調用(invoke)action的。默認的action invoker經過方法名、action名或其餘可能的selector attribute來查找action,而後調用action方法以及定義的filter,最終執行獲得action result。

你會發現大部分執行管線存在於ControllerActionInvoker類的邏輯之中。所以,若是但願改變這些約定,如action方法的選擇邏輯、http參數映射到action參數的方式、選擇和執行filter的方式等,您須要擴展該類並重寫須要修改的方法。

能夠參閱NinjectActionInvoker I developed to allow injection of dependencies inside filters。

5.ASP.NET MVC擴展之ActionMethodSelectorAttribute

使用默認的action invoker時,action的選擇是基於名稱的。您也能夠實現本身的Method Selector以改善對於action的選擇。在框架中已經包含了AcceptVerbs特性,它容許您指定使用哪個HTTP Verb來處理action的響應。

例如,您也許會但願基於瀏覽器所支持的語言或瀏覽器類型(如移動設備的瀏覽器或桌面瀏覽器)來進行action的選取。

6.ASP.NET MVC擴展之AuthorizationFilter

這種過濾器是在action執行以前執行的,用來確保請求是有效的。

框架中已經包含了一些autorization過濾器,最有名的莫過於Authorize特性,它用來檢查當前用戶是否容許執行該action。另外一個是用來阻止CSRF攻擊的ValidateAntiForgeryToken。若是您但願實現本身的authorization,那麼必須實現接口。例如,日期中的小時。

7.ASP.NET MVC擴展之ActionFilter

Action Filters在action執行先後執行。OutputCache過濾器是幾個核心過濾器之一。這多是您最有可能使用的擴展點,而且在我看來,controller只關心它的主要工做,而view所須要的全部其餘數據都必須從action過濾器內部獲取,這樣的實現對於一個組織良好的 view來講,是十分關鍵的。

8.ASP.NET MVC擴展之ModelBinder

默認的model binder使用參數名稱進行HTTP參數到action方法參數的映射。例如,http參數user.address.city將映射到方法參數 user的Address屬性的City屬性。DefaultModelBinder也一樣適用於數組和其餘列表類型。

更進一步來講,例如,您可能但願從數據庫中進行檢索,直接根據person的id將其轉換爲Person對象。Timothy Khouri(網名SingingEels)在他的文章Model Binders in ASP.NET MVC中更好的闡述了這種方法。他的代碼基於Preview 5,但其理念是同樣的。

9.ASP.NET MVC擴展之ControllerBase

全部的Controller均繼承自基類Controller。要想在action中封裝本身的邏輯和約定,建立本身的父類使全部Controller繼承自該類,是一種很好的方式。

10.ASP.NET MVC擴展之ResultFilter

與ActionFilter相似,ResultFilters在ActionResult先後執行。OutputCache過濾器也能夠做爲 ResultFilter的示例。另外,比較經常使用的詮釋這種過濾器的示例是日誌記錄。若是您但願在頁面返回給用戶時記錄日誌,能夠編寫自定義的 RenderFilter,在ActionResult執行以後記錄日誌。

11.ASP.NET MVC擴展之ActionResult

ASP.NET MVC提供了不少result用來呈現視圖、JSON、純文本、文件並重定向到其餘action。若是您須要其餘類型的result,能夠自定義 ActionResult,並實現ExecuteResult方法。例如,若是您但願將PDF文件做爲結果發送,您須要使用PDF庫編寫可以生成PDF的 ActionResult。又如RSS feed,可參見how to write a RssResult in this post。

12.ASP.NET MVC擴展之ViewEngine

您可能不須要編寫本身的view engine,但您也許能夠考慮使用其餘引擎來替代默認的WebForm view engine。在我看來,最有趣的引擎就是Spark。

若是您確實但願編寫本身的view engine,能夠看一下Brad Wilson的文章: Partial Rendering & View Engines in ASP.NET MVC。

13.ASP.NET MVC擴展之HtmlHelper

視圖必須十分簡單整潔,它們只能包含html標記並調用HtmlHelper的輔助方法。視圖中不能包含任何代碼,因此輔助方法必須十分方便,使您能夠將代碼從視圖中提取出來,放到一個可測試的環境中去。正如Rob Conery所說:若是有if,就構造輔助方法(If there's an IF, make a Helper)。

什麼是HtmlHelper輔助方法?其實就是HtmlHelper類的擴展方法,這是惟一的要求。

你能夠從Rob的文章Avoiding Tag Soup中瞭解到爲何說HtmlHelper是封裝視圖中代碼的好方法。

在您的應用中該使用哪一個呢?

正如您所猜想的那樣,並非全部的應用都須要擴展以上的13個擴展點。最可能在全部應用中進行擴展的是ActionFilter和 HtmlHelper。另外,您極可能會使用其餘人編寫的擴展,如使用了IoC容器的ControllerFactory或用來擺脫WebForm的 ViewEngine。

可是,學習這些擴展點並進行嘗試是十分重要的,這樣您纔會作出選擇,並隨時準備在必要的時候使用這些強大的擴展點。下週我將發表一些文章來闡述如何使用這些擴展點。轉自:http://www.cnblogs.com/wichell/archive/2012/02/29/2373849.html

相關文章
相關標籤/搜索