Asp.net-Web-Api
ASP.NET WebAPI:OData 端點的通用控制器
我目前正在 ASP.NET MVC 4 Web API 中試驗 OData 端點。我喜歡這個概念,並嘗試想出有效的方法在我們的項目中使用它。我有一個問題如下:我們有一個服務能夠返回一個 IQueryable 並將實體的名稱作為輸入:
public IQueryable GetAll(string entityName);在標準 Web API(相對於 OData 控制器)中,我可以創建一個通用控制器,它可以以 /api/entities/{entityName} 的形式呼叫並返回 IQueryable。對於 OData 控制器,我執行以下特定於實體的步驟:
- 在模型中註冊實體。
- 為從 EntitySetController<> 派生的每個實體創建一個單獨的控制器。
我想使用通用服務並儘可能多地避免特定於實體的實現。如果服務可以返回實體列表和相應類型,那麼第一步可以很容易地自動化。這留下了第 2 步,因為到目前為止我需要為每個實體創建一個特定的控制器。我也想避免這種情況並創建一個使用通用服務的通用控制器。
誰能推荐一個解決方案,也許是通過影響 OData 路由?
無論實體集是什麼,您都可以創建一個選擇相同控制器的自定義路由約定。例子,
public class CustomControllerRoutingConvention : IODataRoutingConvention { public string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap) { return null; } public string SelectController(ODataPath odataPath, HttpRequestMessage request) { return "SomeFixedContrllerNameWithoutTheControllerSuffix"; } }您可以使用以下程式碼註冊該路由約定,
IList<IODataRoutingConvention> routingConventions = ODataRoutingConventions.CreateDefault(); routingConventions.Insert(0, new CustomControllerRoutingConvention()); config.Routes.MapODataRoute("OData", "odata", builder.GetEdmModel(), new DefaultODataPathHandler(), routingConventions);