【发布时间】:2015-12-29 14:06:21
【问题描述】:
我有一个依赖于 IService 实现的通用 OdataController 实现。
为了避免编写大量控制器,我想为我的服务中的扩展功能做一些事情......
-
在控制器上定义一个方法...
[HttpGet] 公共 IHttpActionResult 方法(参数对象 [] 参数) { var name = args[0].ToString(); var callArgs = args.ToList(); callArgs.RemoveAt(0); 返回 Ok(service.GetType().GetMethod(name).Invoke(service, callArgs.ToArray())); }
假设该方法将至少传入 1 个参数(通过 url),这将是要调用的服务上的方法的名称。
基于此,我会进行调用并返回服务返回的任何结果。
我遇到困难的地方是如何将其映射为 OData 模型中的函数。我目前有这种方法...
void ConfigureSet<T>(ODataConventionModelBuilder builder, Type serviceType) where T : class
{
// register basic CRUD endpoint
var setConfig = builder.EntitySet<T>(typeof(T).Name);
// get methods that are not part of the basic crud set
var methods = serviceType.GetMethods().Except(typeof(IService<>).GetMethods());
// setup some sort of function route to map in the model the method?
builder.EntityType<T>().Collection.Function("Method");
}
最后一行是我卡住的地方,我不确定 WebApi / OData 是否支持这样做,它基本上迫使我为我拥有的每种服务类型创建一个新的控制器类型。
换句话说,如果我在服务中有一个 Foo 方法,我需要控制器中的一个 Foo 方法来匹配它。似乎很浪费,或者我需要重新考虑我的堆栈设计?
【问题讨论】:
标签: generics asp.net-web-api routing odata