动态调用OData构造

时间:2015-10-01 13:32:16

标签: generics asp.net-web-api routing odata

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

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

  1. 在Controller上定义一个方法......

    [HTTPGET] public IHttpActionResult方法(params object [] args) {     var name = args [0] .ToString();     var callArgs = args.ToList();     callArgs.RemoveAt(0);     return Ok(service.GetType()。GetMethod(name).Invoke(service,callArgs.ToArray())); }

  2. 假设该方法将至少传入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方法来匹配它。看起来很浪费,或者我需要重新思考我的堆栈设计?

1 个答案:

答案 0 :(得分:0)

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

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

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