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)
{
...
}
}
但是,fields
,offset
和limit
是经常使用的概念。所以我想要这样的东西:
abstract class ActionParameter
{
public string[] fields;
public int offset;
public int limit;
}
class AthletesGetParameter : ActionParameter
{
public bool clean;
}
class AthletesController
{
IHttp Get(AthletesGetParameter param)
{
...
}
}
我可以这样做吗?
答案 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关于基类的命名,但要回答你的直接问题...... 是的,你可以做到这一点 。