程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 淺談Route組件的設計思考與模式

淺談Route組件的設計思考與模式

編輯:.NET實例教程


Route組件雖然可以說是ASP.Net的“門戶”,不過至今為止似乎都被微軟當作是二等公民。可能是由於自帶的Route類功能已經太強,微軟官方或社區內都不太關注RouteBase的擴展。不過有一點是正確的,那就是在大部分情況下的確沒有必要去擴展RouteBase。事實上,我構建過不少RouteBase類,不過除了DomainRoute之外,其余的都被我放棄了,例如在大半年前寫的《請別埋沒了URL Routing》中所提供的FormatRoute,在MvcPatch中也已經有了更好的替代品(過幾天便會談到這一點)。

  RouteBase職責明確:從請求中獲取數據,及根據數據生成虛擬路徑。它只有兩個方法:GetRouteData和GetVirtualPath,擴展起來非常容易,各種“模式”均可以體現出來。例如DomainRoute和FormatRoute都是使用了裝飾器模式,在內部RouteBase的GetRouteData或GetVirtualPath方法的“前後”再加上一些邏輯(例如DomainRoute中的域名匹配或生成)。有趣的是,在幾個月前我還寫過一個InterceptRoute類:

public class InterceptRoute : RouteBase 
{ 
  public InterceptRoute(RouteBase innerRoute, IList<IRouteInterceptor> interceptors) 
  { 
    this.InnerRoute = innerRoute; 
    this.Interceptors = new InterceptorCollection(interceptors); 
  } 
 
  public RouteBase InnerRoute { get; private set; } 
 
  public InterceptorCollection Interceptors { get; private set; } 
 
  ... 
}

  在很多時候,能夠像一個組件中插入“橫切”的邏輯總是很有用的(例如昨天剛提的NHibernate Interceptor),而上面這個便是在Route規則的各方法前後插入各種邏輯。提供這個邏輯的便是IRouteInterceptor對象,它有四個方法:

  PreGetRouteData

  PostGetRouteData

  PreGetVirtualPath

  PostGetVirtualPath

  從它們的名稱上您也一定可以看得出它們是做什麼的。從理論上來說,無論是DomainRoute還是FormatRoute,只要是為現有方法補充前/後置邏輯的擴展,都可以通過提供IRouteInterceptor來實現。不過我除了DomainRoute以外,還真沒發現其他的使用環境。這個InterceptRoute似乎也是娛樂價值大於實際價值。因此就在這裡一提,等以後忽然發現真有用了我們再拿出來遛遛。

  除了裝飾器模式/InterceptRoute之外,我還曾經想過構建另一種“結構性”(如InterceptRoute一樣,本身不提供實際用途)的Route擴展,那就是利用了組合模式的 Route規則。利用組合模式,我們可以將多個RouteBase對象聚合起來,並且在GetRouteData或GetVirtualPath的時候將職責委派給這些對象。事實上,它的職責就好似Routing框架本身所帶的RouteCollection一樣——當然,之前我們也談過,RouteCollection的邏輯並不那麼單純。

  假設我們已經有了這樣一個CompositeRoute對象收集了一堆Route規則,那麼什麼時候會需要這樣的場景呢?其實DomainRoute就可以是這樣的,因為“一個域名下有多個Route規則”簡直是天經地義的事情。但其實事情並沒有那麼簡單,個中原因便是我們昨天所談論的“命名問題”。

  由於在配置Route規則的時候,我們要為每個Route提供一個名稱——但是這個名稱只是對RouteCollection才有效果,確切地說,只有RouteTable.Routes這個RouteCollection實例才會用到這一點。如此的話,使用CompositeRoute勢必將原本能夠有名稱的多個Route規則捆綁在了一起,我們在生成URL的時候就無法通過名稱定位到特定的Route上了。

  由於RouteCollection中釋放接口有限(也不是開源的,這意味著我們無法改造它),這一點幾乎無法通過自定義邏輯的方式來改進。因此在我看來,CompositeRoute幾乎無法用在任何場景上——DomainRoute當然也不會使用這種設計方式了

本文作者:未知
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved