2012-04-18 4 views
7

나는 수업 상속 웹 API의 API 컨트롤러

Square : Rectangle : Shape (abstract) 

의 몇 가지를 가지고 내가 사용하고 싶습니다 ApiController에서 상속 기본 컨트롤러가 있습니다.

public abstract class BaseController<T> : ApiController where T : class 
{ 
    public abstract IEnumerable<T> Get() 
    ... 
} 

public class DerivedController : BaseController<Rectangle> 
{ 
    public override IEnumerable<Rectangle> Get() 
    ... 
} 

public class AnotherDerivedController : BaseController<Square> 
{ 
    public new IEnumerable<Square> Get() 
    ... 
} 

/API/사각형은 제대로 호출 IEnumerable<Rectangle> Get()

/API/평방 나에게 오류 줄 것이다 : 나는 public new IEnumerable<Square> Get()public override IEnumerable<Square> Get()을 변경하는 경우

Multiple actions were found that match the request: 
System.Linq.IEnumerable`1[Square] Get() on type Web.Api.Controllers.AnotherDerivedController 
System.Linq.IEnumerable`1[Rectangle] Get() on type Web.Api.Controllers.DerivedController 

을 , 나는 후퇴 이후 컴파일 시간 오류가 발생합니다. n 개의 서명이 다릅니다

적절한 코드를 호출하려면 어떻게해야합니까? RegisterRoutes에 각 클래스의 메서드를 명시 적으로 등록해야합니까?

답변

1

Get을 무시해야합니다. 기본적으로 new과 함께 사용합니다. 클래스에 두 가지 가져 오기 방법이 있고 웹 API가 혼란스러워서 어느 것이 나올지 모르니까 작동하지 않습니다.

당신은 BaseControllerabstract로하고 Get 같은 virtual 또는 abstract 다음이 DerivedController에 구현 정의 할 수 있습니다.

+0

안녕하세요 Aliostad, 변경 사항을 반영하도록 질문을 업데이트했습니다. 나는 아직도 여기에 몇 가지 문제가 있지만, 당신의 제안은 나에게 도움이되었다. 감사. – khaihon

0

현재 정사각형 클래스를 사용할 수있는 컨트롤러가 두 대 있습니다. 경로를 어떻게 등록하고 있습니까? 당신이 rectangleController와 SquareController로 콘트롤러의 이름을 바꾸면 아마도 괜찮을 것입니다.

+1

현재 기본 경로가 있습니다. \t \t \t routes.MapHttpRoute (이름 : "DefaultApi", routeTemplate : "api/{컨트롤러}/{id}", 기본값 : new {id = RouteParameter.Optional}); '내 실제 코드에서, 나는 (RectangleController)와 (SquareController)를 가졌지 만, 여전히 올바르게 라우팅되지 않아 동일한 오류 메시지를 표시합니다. – khaihon