ASP.NET MVC 3 RTM 更新(3)

來源:互聯網
上載者:User
五、SessionStateAttribute

構造SessionStateAttribute對象時必須傳入一個SessionStateBehavior枚舉值,通過Attribute的Behavior屬性可以擷取該值。
該Attribute只能用於參考型別(AttributeTargets.Class),不允許重複使用(AllowMultiple=false),允許繼承(Inherited=true)。

六、MvcRouteHandler

MvcRouteHandler類增加了一個接受IControllerFactory介面實作類別的對象作為參數傳的構造方法,構造對象允許傳入null值。而構造方法內部只是簡單的將參數賦給一個私人變數_controllerFactory。

還增加了一個GetSessionStateBehavior虛方法,接受RequestContext型參數,返回一個SessionStateBehavior對象。
在方法內部,建立一個名為controllerFactory的IControllerFactory型局部變數。
如果私人變數_controllerFactory不為null,則賦給controllerFactory,否則通過ControllerBuilder.Current.GetControllerFactory()擷取預設的ControllerFactory(注意,並非就一定是DefaultControllerFactory)賦值。然後返回controllerFactory的GetControllerSessionBehavior方法的執行結果。

GetControllerSessionBehavior方法是IControllerFactory介面新增的。
在DefaultControllerFactory中,GetControllerSessionBehavior是通過反射來擷取對應Controller的SessionStateAttribute(會進行緩衝),並返回它的Behavior屬性。

MvcRouteHandler類的GetHttpHandler方法中,會調用GetSessionStateBehavior方法擷取一個SessionStateBehavior枚舉值,並通過當前請求內容相關的SetSessionStateBehavior設定當前請求的SessionState。當然,GetHttpHandler方法返回的是一個new出來的MvcHandler對象。

從這裡我們不難看出MVC3給我們提供的一個新的擴充點:
1、通過接受IControllerFactory介面實作類別的對象作為參數傳的構造方法建立MvcRouteHandler(RouteCollectionExtensions.MapRoute是通過無參構造方法建立對象)。
2、實現新的IControllerFactory來達到不以預設擷取Controller對應的SessionStateBehavior(比如通過直接緩衝而不是通過反射再緩衝),或者設定某些命名空間下全域的SessionStateBehavior。
3、甚至我們可以實現ActionSessionStateAttribute,設定某個Action的SessionStateBehavior而不是整個Controller。

七、IControllerActivator和DefaultControllerFactory

我們知道,ControllerFactory是為了建立Controller而生,在以上的內容中對此也有所提及。
在MVC3中的DefaultControllerFactory類中,使建立Controller的方式更靈活,並能配合DI(詳見DenpendencyResolver相關)。
首先增加了一個帶IControllerActivator介面參數的公用構造方法。
IControllerActivator介面的唯一方法Create類似於GetControllerInstance方法。
我們知道MVC2的DefaultControllerFactory類中的GetControllerInstance方法直接使用Activator.CreateInstance類建立對象。
通過MVC3中新增的有參公用建構函式,我們可以很容易的改變這種方式。在MV2中我們如果想改變,得重新實現一個IControllerFactory或繼承DefaultControllerFactory類重寫GetControllerInstance需方法。

DefaultControllerFactory還提供了一個internal的帶三個參數的構造方法。該方法的實現機制類似於ControllerBuilder,這裡就不再重複分析。
可以想象,如果該建構函式是public的,我們就用DefaultControllerFactory就可以滅掉很多之前MVC2中,僅為了建立帶有參建構函式Controller類而實現的ControllerFactory。

八、Filter

MVC3新增加了Filter相關的若干類或枚舉:
Filter、FilterProviderCollection、FilterProviders、
GlobalFilterCollection、GlobalFilters、
FilterAttributeFilterProvider、ControllerInstanceFilterProvider、FilterScope

關於Filter的討論在很久以前就做過:
ASP.Net MVC探索之路 - 不想在多個Action上寫同樣的FitlerAttribute(上)
ASP.Net MVC探索之路 - 不想在多個Action上寫同樣的FitlerAttribute(下)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.