C# Web API 2.2,具有路由覆盖的继承控制器(是否可能)?
因此,我有一个实现CRUD的通用基本控制器,它源自C# Web API 2.2,具有路由覆盖的继承控制器(是否可能)?,c#,inheritance,controller,asp.net-web-api2,asp.net-web-api-routing,C#,Inheritance,Controller,Asp.net Web Api2,Asp.net Web Api Routing,因此,我有一个实现CRUD的通用基本控制器,它源自APIController public class GenericController<TEntity> : ApiController where TEntity : class { private readonly GenericModel<TEntity> _model; public IModel Model { get { return _model; } }
APIController
public class GenericController<TEntity> : ApiController where TEntity : class {
private readonly GenericModel<TEntity> _model;
public IModel Model {
get { return _model; }
}
public GenericController(IGenericModel<TEntity> model) {
_model = (GenericModel<TEntity>)model;
}
[HttpPost, Route]
public IHttpActionResult Post(TEntity entity) {
TEntity newEntity = _model.Create(entity);
String urlLink = $"{Request.RequestUri}{RequestContext.VirtualPathRoot}{((IGenericEntity)newEntity).ID}";
return Created(urlLink, newEntity);
}
[HttpGet, Route]
public IHttpActionResult GetList() {
return Ok(_model.ReadList());
}
[HttpGet, Route("{ID:int}")]
public IHttpActionResult Get(Int64 ID) {
return Ok(_model.Read(ID));
}
[HttpPut, Route]
public IHttpActionResult Put(TEntity entity) {
_model.Update(entity);
return Ok();
}
[HttpDelete, Route("{ID:int}")]
public IHttpActionResult Delete(Int64 ID) {
_model.Delete(ID);
return Ok();
}
}
我的CustomDirectRouteProvider位于:
public class CustomDirectRouteProvider : DefaultDirectRouteProvider {
protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(HttpActionDescriptor actionDescriptor) {
return actionDescriptor.GetCustomAttributes<IDirectRouteFactory> (inherit: true);
}
}
所以我的问题是,我怎样才能覆盖路线本身?我基本上希望我的新帖子优先于一般帖子。我认为,由于通用路由/方法被隐藏,这将起作用,但遗憾的是,我的想法是错误的。能够重新创建您的问题,并且通过一个反复尝试的过程,通过使
GenericController
成为一个抽象类,它能够起作用
public abstract class GenericController<TEntity> : ApiController where TEntity : class {
[HttpPost, Route]
public virtual IHttpActionResult Post(TEntity entity) {
TEntity newEntity = _model.Create(entity);
String urlLink = $"{Request.RequestUri}{RequestContext.VirtualPathRoot}{((IGenericEntity)newEntity).ID}";
return Created(urlLink, newEntity);
}
}
能够重新创建您的问题,并通过反复试验,使
GenericController
成为一个抽象类,从而使问题得以解决
public abstract class GenericController<TEntity> : ApiController where TEntity : class {
[HttpPost, Route]
public virtual IHttpActionResult Post(TEntity entity) {
TEntity newEntity = _model.Create(entity);
String urlLink = $"{Request.RequestUri}{RequestContext.VirtualPathRoot}{((IGenericEntity)newEntity).ID}";
return Created(urlLink, newEntity);
}
}
这很有帮助,谢谢。我仍然需要能够实例化GenericController,所以我创建了一个抽象BaseController,然后从中派生出我的GenericController,最后从GenericController派生出我的DerivedController。所有部件都符合要求,并按预期工作。:)有趣的是,我也测试了这个模型,但没有包括它,因为我认为它超出了你文章的范围。不知道你必须实例化。这很有帮助,谢谢。我仍然需要能够实例化GenericController,所以我创建了一个抽象BaseController,然后从中派生出我的GenericController,最后从GenericController派生出我的DerivedController。所有部件都符合要求,并按预期工作。:)有趣的是,我也测试了这个模型,但没有包括它,因为我认为它超出了你文章的范围。不知道你必须实例化。
"Multiple actions were found that match the request"
public abstract class GenericController<TEntity> : ApiController where TEntity : class {
[HttpPost, Route]
public virtual IHttpActionResult Post(TEntity entity) {
TEntity newEntity = _model.Create(entity);
String urlLink = $"{Request.RequestUri}{RequestContext.VirtualPathRoot}{((IGenericEntity)newEntity).ID}";
return Created(urlLink, newEntity);
}
}
[RoutePrefix(@"api/Test")]
public class DerivedController : GenericController<ConcreteEntity> {
public DerivedController (IGenericModel<ConcreteEntity> model) : base(model) {
}
public override IHttpActionResult Post(ConcreteEntity entity) {
//New Post Functionality Here
}
}