2014-10-09 4 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 예외를 throw해야합니까?

또한 위의 모든 동작에서 IEnumerable 및 T 대신 IHttpActionResult를 반환하는 것이 가장 좋습니다.

+0

질문에 대답 할 지식이 없지만 흥미로워서 조금 연구를하고 [this] (http://stackoverflow.com/questions/106383/c-sharp)를 제안했습니다. public-inherited-methods-be-hidden-eg-private-to-derived)를 사용할 수 있습니다. 받아 들여진 응답은 좋은 설명을 만들어 그래서 나는 그것을 역시 좋아한다 : 희망한다 도움이된다. –

답변

1

구현이 전혀없는이 기본 클래스는 전혀 이해가되지 않습니다. 왜 그것을 원하니? 일부 동작을 추상화해야하는 경우 인터페이스를 사용하는 것이 좋습니다. 그리고 인터페이스를 사용하면 훨씬 더 많은 유연성을 얻을 수 있습니다. 다른 인터페이스를 정의하고 구현할 수도 있습니다.

공통 구현이있는 경우이 상속 클래스를 사용하면 모든 상속 클래스에서 공유됩니다. 이 특별한 경우에는 T 유형 매개 변수가있어서 일반 구현을 구현하고 공유 할 수 있습니다. 그러면이 클래스가 더 유용 할 것입니다. 그렇게했다면, 메소드를 가상으로 선언해야만, 특별한 경우를 위해 구현을 변경할 기회를 얻고, 그렇지 않으면 기본 구현을 사용할 수 있습니다.

IHttpActionResult 또는 특정 유형 또는 컬렉션을 반환하는 것과 관련하여 웹 API를 구현할 때 완벽하고 자연스럽고 유익합니다. 따라서 리턴 유형을 의미가있는 특정 유형 (예 : T 또는 T)으로 변경해야합니다.

인터페이스 아이디어와 기본 클립을 결합하여 구현할 수도 있습니다. 그렇게하면 모든 기능을 갖춘 기본 클래스와 필요한 기능 만 제공 할 수있는 일련의 인터페이스를 가질 수 있습니다.