Mar*_*kus 9 odata asp.net-web-api
我目前正在ASP.NET MVC 4 Web API中尝试OData端点.我喜欢这个概念,并尝试在我们的项目中提出有效的方法.我有一个问题如下:我们有一个服务,它能够返回一个IQueryable并将一个实体的名称作为输入:
public IQueryable GetAll(string entityName);
Run Code Online (Sandbox Code Playgroud)
在标准Web API(与OData控制器相对)中,我可以创建一个通用控制器,可以以/ api/entities/{entityName}的形式调用并返回IQueryable.如果是OData控制器,我执行以下特定于实体的步骤:
我想使用通用服务并避免尽可能多的特定于实体的实现.如果服务可以返回实体列表和相应类型,则可以轻松地自动完成第一步.这留下了第2步,因为到目前为止我需要为每个实体创建一个特定的控制器.我还想避免这种情况,并创建一个使用通用服务的通用控制器.
任何人都可以通过影响OData路由推荐解决方案吗?
Rag*_*nti 11
无论实体集是什么,您都可以创建选择相同控制器的自定义路由约定.例,
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";
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用以下代码注册该路由约定,
IList<IODataRoutingConvention> routingConventions = ODataRoutingConventions.CreateDefault();
routingConventions.Insert(0, new CustomControllerRoutingConvention());
config.Routes.MapODataRoute("OData", "odata", builder.GetEdmModel(), new DefaultODataPathHandler(), routingConventions);
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的问题,最后写了一个习惯IHttpControllerSelector而不是一个IODataRoutingConvention. IODataRoutingConvention如果你的通用控制器不需要泛型:)看起来是个不错的选择.但由于IODataRoutingConvention.SelectController()只返回一个字符串,我不知道它如何用于实例化具有泛型类型参数的控制器.
我认为这个问题需要一个好的,通用的,开源的解决方案 - 所以我创建了一个:http://entityrepository.codeplex.com.现在是预发布,但我目前正在做很多工作.我认为除了选择正确的控制器之外还有更多内容,还有为共享控制器定义的通用模式,默认情况下,Web API OData需要强类型和强命名的导航属性,这使得创建可重用的实现变得具有挑战性.
| 归档时间: |
|
| 查看次数: |
5957 次 |
| 最近记录: |