【问题标题】:Dynamic call OData construction动态调用OData构建
【发布时间】:2015-12-29 14:06:21
【问题描述】:

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

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

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

    [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


    【解决方案1】:

    无法为不是控制器上的方法的操作创建路由。

    OData 模型似乎没有任何机制来表示“添加功能/操作并将其路由到此方法以在请求进入时进行处理”。

    从 OData 模型到控制器的连接基于命名约定,因此必须定义特定于您想要的方法。

    【讨论】:

      猜你喜欢
      • 2014-06-17
      • 2018-07-03
      • 1970-01-01
      • 2019-08-29
      • 2018-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多