程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET MVC Controller激活系統詳解:總體設計

ASP.NET MVC Controller激活系統詳解:總體設計

編輯:關於ASP.NET

我們將整個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: }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved