我目前正在 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)