2012-11-16 26 views
0

我們的MVC3路由引擎具有一對條目,它們的約束涉及數據庫查找以進行評估。例如:MVC RouteUrl性能與約束中的數據庫查找

 routes.MapRoute(
      "Product", 
      "{manufacturer}/{partNumber}", 
      new { controller = "Product", action = "Details", manufacturer = "" }, 
      new { manufacturer = new ManufacturerConstraint() } 
     ); 
     routes.MapRoute(
      "Store", 
      "{store}/{action}", 
      new { controller = "Store", action = "Index" }, 
      new { store = new StoreConstraint() } 
     ); 

其中ManufacturererConstraint()涉及數據庫查找和StoreConstraint()沒有。

我們使用RouteUrl產生類似的鏈接:從這個

RouteUrl("Product", new { manufacturer = product.Brand, partNumber = product.PartNumber }); 

三個問題:

  1. 難道我們的使用會導致數據庫查詢?
  2. 如果我爲「Store」路由生成路由,它是否也會生成一個查找,因爲它會針對所有路由進行測試?或者它只會對指定的路線進行一次測試?
  3. 如果它在這種用法中擊中了數據庫,有沒有辦法使用RouteUrl那不會?

回答

1

我們的用法是否會導致數據庫查找?

是的,如果約束被設置爲在UrlGeneration上工作。 Url.RouteUrl運行所有約束,就像Url.Action。唯一的區別是,你明確地說出你想使用哪條路線,而不是直到一個路線匹配才測試每條路線。

如果我生成了「商店」路線的路線,是否會也會產生 查找因爲它測試它針對所有路線?或者它只會對指定路線執行一次測試 ?

我想我回答了上述問題。

如果它在這種用法中擊中數據庫,有沒有辦法使用 RouteUrl不會?

設置約束,使其無法在UrlGeneration上運行(使用參數routeDirection)。就個人而言,我會緩存查找數據。

+0

那麼在約束中,如果'routeDirection == RouteDirection.IncomingRequest'只命中數據庫?我曾想過緩存數據,但理論上它可能隨時發生變化 - 例如,可以在現場添加新品牌以向代表展示,或者我們可能不得不盡快降低數據量。如果有一種方法可以將它緩存起來,以便我們可以根據需要對它進行無效和重新加載,那麼我肯定會研究這一點。 – Bobson

+0

爲什麼你需要檢查數據庫的URL生成?如果你從數據庫中得到partNumber,你就知道它是有效的。對於傳入的請求,執行該操作通常會檢查操作方法,並返回404(如果它不存在)。 –

+0

上一代,我們沒有。但直到這個答案,我不知道這是可能的。實現傳入請求的問題在於,我們有幾條路線可以匹配給定的URL,具體取決於第一件事是品牌還是商店名稱(或其他幾件事)。所以要麼我們有一個巨大的動作來處理所有的解析,然後返回正確的控制器動作,或者我們檢查每個動作。 – Bobson