如何让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返回所需的字符串。
默认情况下,属性路由不会被继承,但在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);
}
}