动态调用OData构建
Dynamic call OData construction
我有一个依赖于 IService 实现的通用 OdataController 实现。
为了避免编写大量控制器,我想在我的服务中做一些这样的扩展功能...
在控制器上定义一个方法...
[HttpGet]
public IHttpActionResult 方法(参数对象[] args)
{
var name = args[0].ToString();
var callArgs = args.ToList();
callArgs.RemoveAt(0);
return 好的(service.GetType().GetMethod(名称).Invoke(服务, callArgs.ToArray()));
}
假设该方法将至少传入 1 个参数(通过 url),这将是要调用的服务上的方法的名称。
基于此,我会拨打电话 return 无论服务返回什么结果。
我卡住的地方是如何将其映射为 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 方法来匹配它。看起来很浪费,或者我需要重新考虑我的堆栈设计?
无法创建指向不是控制器方法的操作的路由。
OData 模型似乎没有任何表达 "add function / action and route it to this method for handling when a request comes in" 的机制。
从 OData 模型到控制器的连接基于命名约定,因此必须定义您想要的特定方法。
我有一个依赖于 IService 实现的通用 OdataController 实现。
为了避免编写大量控制器,我想在我的服务中做一些这样的扩展功能...
在控制器上定义一个方法...
[HttpGet] public IHttpActionResult 方法(参数对象[] args) { var name = args[0].ToString(); var callArgs = args.ToList(); callArgs.RemoveAt(0); return 好的(service.GetType().GetMethod(名称).Invoke(服务, callArgs.ToArray())); }
假设该方法将至少传入 1 个参数(通过 url),这将是要调用的服务上的方法的名称。
基于此,我会拨打电话 return 无论服务返回什么结果。
我卡住的地方是如何将其映射为 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 方法来匹配它。看起来很浪费,或者我需要重新考虑我的堆栈设计?
无法创建指向不是控制器方法的操作的路由。
OData 模型似乎没有任何表达 "add function / action and route it to this method for handling when a request comes in" 的机制。
从 OData 模型到控制器的连接基于命名约定,因此必须定义您想要的特定方法。