动态调用OData构建

Dynamic call OData construction

我有一个依赖于 IService 实现的通用 OdataController 实现。

为了避免编写大量控制器,我想在我的服务中做一些这样的扩展功能...

  1. 在控制器上定义一个方法...

    [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 模型到控制器的连接基于命名约定,因此必须定义您想要的特定方法。