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 });
三個問題:
- 難道我們的使用會導致數據庫查詢?
- 如果我爲「Store」路由生成路由,它是否也會生成一個查找,因爲它會針對所有路由進行測試?或者它只會對指定的路線進行一次測試?
- 如果它在這種用法中擊中了數據庫,有沒有辦法使用
RouteUrl
那不會?
那麼在約束中,如果'routeDirection == RouteDirection.IncomingRequest'只命中數據庫?我曾想過緩存數據,但理論上它可能隨時發生變化 - 例如,可以在現場添加新品牌以向代表展示,或者我們可能不得不盡快降低數據量。如果有一種方法可以將它緩存起來,以便我們可以根據需要對它進行無效和重新加載,那麼我肯定會研究這一點。 – Bobson
爲什麼你需要檢查數據庫的URL生成?如果你從數據庫中得到partNumber,你就知道它是有效的。對於傳入的請求,執行該操作通常會檢查操作方法,並返回404(如果它不存在)。 –
上一代,我們沒有。但直到這個答案,我不知道這是可能的。實現傳入請求的問題在於,我們有幾條路線可以匹配給定的URL,具體取決於第一件事是品牌還是商店名稱(或其他幾件事)。所以要麼我們有一個巨大的動作來處理所有的解析,然後返回正確的控制器動作,或者我們檢查每個動作。 – Bobson