ASP.Net MVC探索之路 – 不想在多個Action上寫同樣的FitlerAttribute(下)

來源:互聯網
上載者:User
距離上一篇的分析已經好幾天。一是由於關注的人比較少,二是正在移植入ASP.NET MVC 3.0 RC,所以就沒急著做出來。
今天花了點時間把Demo做出來提供給大家下載,希望大家能夠提點意見。

我們知道,在ASP.NET MVC 3.0中為我們提供了一個GlobalFilters(包含一個GlobalFilterCollection)用於註冊全域Filter,但它也不夠靈活——其實也不能這麼說,因為它的目的本來就只是要提供一個全域的Filter註冊器。包括GlobalFilters在內,ASP.NET MVC 3.0 RC相較於2.0 RTM增加了10個左右的介面、類或枚舉來增強Filter,並且為ControllerActionInvoker增加了2個建構函式來配合這一切。特別是新增加的FilterAttributeFilterProvider、GlobalFilterCollection這兩個IFilterProvider,使Filter可以進行緩衝,相對於ASP.NET MVC 2.0,效能上有所提升。目前白皮書上只有寥寥幾句稍微提到這方面而已。

在今天的Demo中,我實現了一個FilterRegistryFilterProvider:IFilterProvider,它與GlobalFilters比較的優點在於提供了一種可擴充、可配置的Filter注入方式:

1、摒棄在Controller和Action上標記Attribute的方式實現Filter注入的方式,在需要時通過反射來來擷取,雖然我對反射並無惡感,既然能提高那麼一點點效能,又何樂而不為呢。而且將Filter在Controller外部注入,也去除了與Controller的耦合性。就正如GlobalFilters一樣,不需要使用Attribute標記的方式來注入。
2、如果有AController、BController、CDEFG...等,可以指定只在某些Controller注入Filter,需求改變時,可以方便取消注入。正如第一條所說,這一切都不用改動我們已經編譯好的Controllers。
3、如果AController的ActionA和BController的ActionC需要某個Filter,可以精確注入。
4、可以讓某個或某些Route下的Action注入
5、可以讓某個RouteValue等於(不等於、包含)某個值的請求注入Filter。6、可以讓某個DataToken等於(不等於、包含)某個值的請求注入Filter(比如可以給某些area注入)。

7、多個條件組合起來判斷,滿足進階需求。
8、在系統初始化時,可以像GlobalFilters那樣對Filter執行個體進行緩衝,避免不必要的重複建立銷毀過程(感謝鶴衝天提醒)
9、您可以很容易的繼續擴充注入的條件。

話不多說了,上Demo。另,Demo需要ASP.NET MVC 3.0 RC或更高版本、.Net Framework 4。

:FilterRegistryDemo

相關文章

聯繫我們

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