ASP.NET MVC Controller啟用系統詳解:總體設計

來源:互聯網
上載者:User

我們將整個ASP.NET MVC架構劃分為若干個子系統,那麼針對請求上下文啟用目標Controller對象的子系統被我們成為Controller啟用系統。在正式討論Controller對象具體是如何被建立愛之前,我們先來看看Controller啟用系統在ASP.NET MVC中的總體設計,瞭解一下組成該子系統的一些基本的組件,以及它們對應的介面或者抽象類別是什麼。

一、Controller

我們知道作為Controller的類型直接或者間接實現了IController介面。如下面的代碼片斷所示,IController介面僅僅包含一個參數類型為RequestContext的Execute方法。當一個Controller對象被啟用之後,核心的操作就是根據請求上下文解析出目標Action方法,並通過Model綁定機制從請求上下文中提取相應的資料對應為方法的參數並最終執行Action方法。所有的這些操作都是調用這個Execute方法來執行的。

   1: public interface IController
2: {
3: void Execute(RequestContext requestContext);
4: }

定義在IController介面中的Execute是以同步的方式執行的。為了支援以非同步方式對請求的處理,IController介面的非同步版本System.Web.Mvc.IAsyncController被定義出來。如下面的代碼片斷所示,實現了IAsyncController介面的非同步Controller的執行通過BeginExecute/EndExecute方法組合來完成。

   1: public interface IAsyncController : IController
2: {
3: IAsyncResult BeginExecute(RequestContext requestContext, AsyncCallback callback, object state);
4: void EndExecute(IAsyncResult asyncResult);
5: }

抽象類別ControllerBase實現了IController介面,它具有如下幾個重要的屬性。TemplateData、ViewBag和ViewData用於儲存從Controller向View傳遞的資料或者變數。其中TemplateData和ViewData具有基於字典的資料結構,Key和Value分別表示變數的名稱和值,所不同的前者用於儲存基於當前HTTP內容相關的變數(在完成當前請求後,儲存的資料會被回收)。ViewBag和ViewData具有相同的作用,甚至對應著相同的資料存放區,它們之間的不同之處在於前者是一個動態對象,我們可以為其指定任意屬性。

   1: public abstract class ControllerBase : IController
2: {
3: //其他成員
4: public ControllerContext ControllerContext { get; set; }
5: public TempDataDictionary TempData { get; set; }
6: public object ViewBag { [return: Dynamic] get; }
7: public ViewDataDictionary ViewData { get; set; }
8: }

在ASP.NET MVC中我們會陸續遇到一系列的上下文(Context)對象,之前我們已經對錶示請求內容相關的RequestContext(HttpContext + RouteData)進行了詳細的介紹,現在我們來介紹另一個具有如下定義的上下文類型ControllerContext。

   1: public class ControllerContext
2: {
3: //其他成員
4: public ControllerContext();
5: public ControllerContext(RequestContext requestContext, ControllerBase controller);
6: public ControllerContext(HttpContextBase httpContext,
7: RouteData routeData, ControllerBase controller);
8:
9: public virtual ControllerBase Controller { get; set; }
10: public RequestContext RequestContext { get; set; }
11: public virtual HttpContextBase HttpContext { get; set; }
12: public virtual RouteData RouteData { get; set; }
13: }

顧名思義,ControllerContext就是基於某個Controller對象的上下文。從如下的代碼所示,ControllerContext是實際上是對一個Controller對象和RequestContext的封裝,這兩個對象分別對應著定義在ControllerContext中的同名屬性,並且可以在建構函式中被初始化。而通過屬性HttpContext和RouteData屬性返回的HttpContextBase和RouteData對象在預設情況下實際上就是組成RequestContext的核心元素。ControllerContext的這四個屬性都是可讀可寫的,我們對其進行任意地修改。當ControllerBase的Execute方法被執行的時候,它會根據傳入的ReuqestContext建立ControllerContext對象,而後續的操作可以看成是在該上下文中進行。

當我們在進行開發的時候,通過VS預設建立的Controller類型實際上繼承自抽象類別Controller。該類型中定義了很多的輔助方法和屬性以編程變得簡單。如下面的代碼片斷所示,除了直接繼承ControllerBase之外,Controller類型還顯式實現了IController和IAsyncController介面,以及代表ASP.NET MVC 四大篩選器(AuthorizationFilter、ActionFilter、ResultFilter和ExceptionFilter)的4個介面。

   1: public abstract class Controller :
2: ControllerBase,
3: IController,
4: IAsyncController,
5: IActionFilter,
6: IAuthorizationFilter,
7: IExceptionFilter,
8: IResultFilter,
9: IDisposable,
10: ...
11: {
12: //省略成員
13: }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.