我有一个基本控制器:
public abstract class EntityController<T> : BaseController
{
public EntityController(ILogService logService) : base(logService) { }
[HttpGet]
public abstract IEnumerable<T> Get();
[HttpGet]
public abstract T Get(int id);
[HttpPost]
[ValidateModel]
public abstract IHttpActionResult Create(T dto);
[HttpPut]
[ValidateModel]
public abstract IHttpActionResult Update(T dto);
[HttpDelete]
public abstract IHttpActionResult Delete(int id);
}
在继承此类的大多数控制器上,一切正常。但是,我有几个控制器,我想隐藏&#39; Get()动作。
是否可以在操作级别执行此操作,还是应该抛出MethodNotFound异常?
另外,上述所有操作的最佳做法是返回IHttpActionResult而不是IEnumerable和T?
答案 0 :(得分:1)
这个没有任何实现的基类没有意义。你为什么需要它?如果您需要抽象某些行为,则最好使用界面。使用界面可以提供更大的灵活性。您甚至可以定义和实现不同的接口。
如果存在所有继承类共享的公共实现,则使用此类基类是有意义的。在这种特殊情况下,您具有T
类型参数,这可以允许您实现和共享通用实现。这会使这个课更有用。如果您这样做,则应将方法声明为虚拟,以便您有机会更改特殊情况的实现,否则使用基本实现。
关于返回IHttpActionResult
或特定类型或集合,当您实施Web API时,它非常自然,信息量更大。因此,您应该将返回类型更改为特定类型(例如T
或T
的集合),这是有意义的。
你甚至可以结合接口和base clase(带有一些实现)的想法。如果这样做,您可以拥有一个具有所有功能的基类,以及一组接口,这些接口允许您仅公开所需的功能。