gpt4 book ai didi

asp.net-web-api - ASP.NET WebAPI : Generic controller for OData endpoint

转载 作者:行者123 更新时间:2023-12-02 20:09:31 24 4
gpt4 key购买 nike

我目前正在 ASP.NET MVC 4 Web API 中试验 OData 端点。我喜欢这个概念,并尝试想出在我们的项目中使用它的有效方法。我有一个问题如下:我们有一项服务能够返回 IQueryable 并将实体的名称作为输入:

public IQueryable GetAll(string entityName);

在标准 Web API(而不是 OData Controller )中,我可以创建一个通用 Controller ,可以以/api/entities/{entityName} 形式调用它并返回 IQueryable。对于 OData Controller ,我执行以下特定于实体的步骤:

  1. 在模型中注册实体。
  2. 为派生自 EntitySetController<> 的每个实体创建一个单独的 Controller 。

我想使用通用服务并尽可能避免特定于实体的实现。如果服务可以返回实体和相应类型的列表,则第一步可以轻松自动化。剩下步骤 2,因为到目前为止我需要为每个实体创建一个特定的 Controller 。我还想避免这种情况并创建一个使用通用服务的通用 Controller 。

任何人都可以推荐一个解决方案吗?也许可以通过影响 OData 路由来实现?

最佳答案

您可以创建自定义路由约定,无论实体集是什么,该约定都会选择相同的 Controller 。例如,

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);

关于asp.net-web-api - ASP.NET WebAPI : Generic controller for OData endpoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17111386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com