Asp.net-Web-Api

ASP.NET WebAPI:OData 端點的通用控制器

  • December 6, 2019

我目前正在 ASP.NET MVC 4 Web API 中試驗 OData 端點。我喜歡這個概念,並嘗試想出有效的方法在我們的項目中使用它。我有一個問題如下:我們有一個服務能夠返回一個 IQueryable 並將實體的名稱作為輸入:

public IQueryable GetAll(string entityName);

在標準 Web API(相對於 OData 控制器)中,我可以創建一個通用控制器,它可以以 /api/entities/{entityName} 的形式呼叫並返回 IQueryable。對於 OData 控制器,我執行以下特定於實體的步驟:

  1. 在模型中註冊實體。
  2. 為從 EntitySetController<> 派生的每個實體創建一個單獨的控制器。

我想使用通用服務並儘可能多地避免特定於實體的實現。如果服務可以返回實體列表和相應類型,那麼第一步可以很容易地自動化。這留下了第 2 步,因為到目前為止我需要為每個實體創建一個特定的控制器。我也想避免這種情況並創建一個使用通用服務的通用控制器。

誰能推荐一個解決方案,也許是通過影響 OData 路由?

無論實體集是什麼,您都可以創建一個選擇相同控制器的自定義路由約定。例子,

public class CustomControllerRoutingConvention : IODataRoutingConvention
{
   public string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup&lt;string, HttpActionDescriptor&gt; actionMap)
   {
       return null;
   }

   public string SelectController(ODataPath odataPath, HttpRequestMessage request)
   {
       return "SomeFixedContrllerNameWithoutTheControllerSuffix";
   }
}

您可以使用以下程式碼註冊該路由約定,

IList&lt;IODataRoutingConvention&gt; routingConventions = ODataRoutingConventions.CreateDefault();
routingConventions.Insert(0, new CustomControllerRoutingConvention());
config.Routes.MapODataRoute("OData", "odata", builder.GetEdmModel(), new DefaultODataPathHandler(), routingConventions);

引用自:https://stackoverflow.com/questions/17111386