2014-10-09 96 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(有一些實現)。如果你這樣做了,你可以擁有一個包含所有功能的基類和一組接口,這將允許你只公開所需的功能。