2014-10-09 93 views
1

我有一个基本的控制器:Asp.Net WebApi2隐藏控制器动作

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); 
} 

一切工作的大多数控制器继承此类罚款。但是,我有几个控制器,我想'隐藏'Get()动作。

是否有可能在动作级别这样做,还是应该抛出MethodNotFound异常?

此外,是否所有上述操作返回IHttpActionResult而不是IEnumerable和T的最佳做法?

+0

我没有知识来回答你的问题,但我发现它很有趣,所以我做了一点研究,并拿出[this](http://stackoverflow.com/questions/106383/c-sharp - 可以-公开继承的方法 - 可以隐藏 - 例如制造和私营部门对衍生)。接受的答案是一个很好的解释,所以我也喜欢它:)希望它有帮助。 – 2014-10-09 12:12:51

回答

1

这个没有任何实现的基类是没有意义的。你为什么需要它?如果你需要抽象一些行为,你最好使用一个接口。并且使用界面提供了更多的灵活性。你甚至可以定义和实现不同的接口。

使用这种基类是有道理的,如果有一个共同的实现,所有的继承类共享。在这种特殊情况下,您可以使用T类型参数,它可以让您实现和共享通用实现。这将使这个类更有用。如果你这样做了,你应该声明这些方法是虚拟的,这样你就有机会改变特殊情况下的实现,否则就使用基本实现。

至于返回IHttpActionResult或特定类型或集合,当您实现Web API时,它是完全自然的,并且更具信息性。因此,您应该将返回类型更改为特定类型(例如TT的集合),这样才有意义。

你甚至可以结合接口的想法和base clase(有一些实现)。如果你这样做了,你可以拥有一个包含所有功能的基类和一组接口,这将允许你只公开所需的功能。