WebApi Controller动作参数基类,用于常见功能

时间:2015-08-04 13:35:30

标签: asp.net-web-api

WebApi Controller操作共享相同功能的位置,例如分页和部分响应,是否可以创建一个基类来模拟这些参数?

例如,这个URI:

http://letsdoitclean.com/api/v1/athletes?clean=true&fields=name,age&offset=0&limit=25

可能会映射到:

class AthletesController
{
    IHttp Get(bool clean, string[] fields, int offset, int limit)
    {
        ...
    }
}

但是,fieldsoffsetlimit是经常使用的概念。所以我想要这样的东西:

abstract class ActionParameter
{
    public string[] fields;
    public int offset;
    public int limit;
}

class AthletesGetParameter : ActionParameter
{
    public bool clean;
}

class AthletesController
{
    IHttp Get(AthletesGetParameter param)
    {
        ...
    }
}

我可以这样做吗?

2 个答案:

答案 0 :(得分:1)

这也可以通过将其全局添加到您的WebApiConfig来实现,这样您就不必在每个控制器操作中对其进行标记:

config.ParameterBindingRules.Insert(0, descriptor =>
            typeof(ActionParameter).IsAssignableFrom(descriptor.ParameterType)
                ? new FromUriAttribute().GetBinding(descriptor)
                : null);

答案 1 :(得分:0)

是的,绝对可以做到这一点。如果您在此示例中为复杂对象指定FromUriAttribute,则ASP.NET将处理参数绑定:

public class AthletesController : ApiController
{
    public string Get([FromUri] AthletesGetParameter athletesGetParam)
    {
        // ...
    }
}

我唯一想从你的问题中反对的是abstract class的名字。它并没有真正描述基类的完整性以及它的用途。也许像abstract class PaginationParameter或类似的东西。把它称为ActionParameter可能会让你在将来(或其他程序员)混淆你所有的动作参数应该派生出这个类,我认为这是不对的。

也许minutia关于基类的命名,但要回答你的直接问题...... 是的,你可以做到这一点