我有很少的控制器继承自同一个基类。在他们不相互分享的不同行为中,他们确实有一些完全相同。我希望在我的基类上有这些,因为它们完全相同,只是通过不同的路径访问它们。
如何使用多种不同路线定义这些操作?
我继承的类也设置了RoutePrefixAttribute
,因此每个类都指向不同的路径。
我有一个名为Vehicle
的基础抽象类,然后继承了Car
,Bike
,Bus
等等。所有这些都会有共同的行动Move()
/bus/move
/car/move
/bike/move
如何在我的基类Move()
上定义操作Vehicle
,以便它将在每个子类路由上执行?
答案 0 :(得分:11)
检查我在此处提供的答案WebApi2 attribute routing inherited controllers,该帖子引用了此帖.NET WebAPI Attribute Routing and inheritance的答案
您需要做的是覆盖DefaultDirectRoutePrivider
:
public class WebApiCustomDirectRouteProvider : DefaultDirectRouteProvider {
protected override IReadOnlyList<IDirectRouteFactory>
GetActionRouteFactories(HttpActionDescriptor actionDescriptor) {
// inherit route attributes decorated on base class controller's actions
return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(inherit: true);
}
}
完成后,您需要在web api配置中进行配置
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
.....
// Attribute routing. (with inheritance)
config.MapHttpAttributeRoutes(new WebApiCustomDirectRouteProvider());
....
}
}
然后,您就可以按照此描述进行操作
public abstract class VehicleControllerBase : ApiController {
[Route("move")] //All inheriting classes will now have a `{controller}/move` route
public virtual HttpResponseMessage Move() {
...
}
}
[RoutePrefix("car")] // will have a `car/move` route
public class CarController : VehicleControllerBase {
public virtual HttpResponseMessage CarSpecificAction() {
...
}
}
[RoutePrefix("bike")] // will have a `bike/move` route
public class BikeController : VehicleControllerBase {
public virtual HttpResponseMessage BikeSpecificAction() {
...
}
}
[RoutePrefix("bus")] // will have a `bus/move` route
public class BusController : VehicleControllerBase {
public virtual HttpResponseMessage BusSpecificAction() {
...
}
}
答案 1 :(得分:0)
这就是我所做的,它按照你在问题中提到的方式工作。
我创建了基础ApiController类并从中继承了我的所有API控制器。我在我的Base类中定义了Delete操作(返回string
“Not Supported”)并且没有在我的任何子控制器上定义delete。现在,当我在任何控制器上执行删除时,我收到消息“不支持”,即调用基类的删除。 (我正在对孩子做删除请求,而不是在基础上,即/自行/移动)
但是如果我在任何控制器上定义删除它会给我警告隐藏基础实现,但是在做api的删除请求时我会得到 - "An error has occurred."
我没有尝试过做RoutePrefix方式。