如何让MapHttpAttributeRoutes注册父类路由

本文关键字:父类 路由 注册 MapHttpAttributeRoutes | 更新日期: 2023-09-27 18:19:57

我有一个案例,我试图创建一大堆Api控制器。我已经创建了一个基类控制器,它具有所有基本的GET、PUT、POST、DELETE操作以及其他一些项目中常见的操作。

然后,我使用T4将我的数据库中的每个表(EF上下文,但同样如此)脚本化为一个控制器,显然是从父控制器(最终继承自ApiController)继承的。除了一些路由问题外,一切都很好。

显然,您不能在基类中定义属性路由并让MapHttpAttributeRoutes找到它们。

考虑到下面的suedo代码,是否有任何与这种信念相反的建议?是否有"好"的方法来处理这一问题?现在的想法是抛弃基类,在T4中编写每个控制器的脚本。

public class TestBaseController: ApiController {
    // GET api/user
    [Route("")]
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
}

[RoutePrefix("apiv2/user")]
public class UserController:  TestBaseController
{
    [Route("type")]
    [HttpGet]
    public string GetType()
    {
        return "my test type";
    } ...

apiv2/user/导致404,但apiv2/user/type返回所需的字符串。

如何让MapHttpAttributeRoutes注册父类路由

默认情况下,属性路由不会被继承,但在WebApi2.2中,我们添加了一种功能:

示例:

public class BaseController : ApiController
{
    [Route("{id:int}")]
    public string Get(int id)
    {
        return "Success:" + id;
    }
}
[RoutePrefix("api/values")]
public class ValuesController : BaseController
{
}
//---------------------------------------------------
config.MapHttpAttributeRoutes(new CustomDirectRouteProvider());
public class CustomDirectRouteProvider : DefaultDirectRouteProvider
{
    protected override IReadOnlyList<IDirectRouteFactory> 
    GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
    {
        return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>
        (inherit: true);
    }
}