ASP.NET을 사용하여 WebApi를 구축 중입니다. 이제는 전체 응용 프로그램을 몇 개의 레이어로 나누었으며 그 중 두 개는 "인터페이스"와 "모델"입니다 (레이어마다 하나씩 .dll이 있습니다). "models.dll"에서 모든 모델이 정의되고 응용 프로그램 시작시 필요한 위치에 주입이 시작됩니다. 여태까지는 그런대로 잘됐다. 이제는 내 컨트롤에서 값을 반환 할 때 문제가 발생했습니다. 의는 다음을 가정 해 봅시다 :C# (Web API) 종속성 삽입 (Unity 사용) 반환 유형 인터페이스
public class TestController : ApiController
{
IBusinessObject _businessObject;
public TestController(IBusinessObject businessObject)
{
this._businessObject= businessObject;
}
[Route("details/object/{id}")]
[HttpGet]
public ISomeObject GetObjectByNr(int id)
{
return this._businessObject.SearchForObject(id);
}
}
을 이제 GetObjectByNr 볼 때 당신이 그것의 반환 형식이 ISomeObject
(this._businessObject.SearchForObject (ID의 물론 반환 형식)도 ISomeObject되는) 것을 볼 수 있습니다. ISomeObject의 실제 구현은 ModelLayer 내부에 있지만 인터페이스를 통해서만 통신하기 때문에 WebApi 프로젝트에 포함하고 싶지 않습니다. 이제 내가 이렇게 실행하면 DataContractResolver
(일련 화에 대해)을 사용해야한다고하는 오류가 발생합니다. 나는 인터페이스를 직렬화 할 수 없다는 것을 알고 있지만, 제 응용 프로그램이 여기에 주입 할 올바른 클래스를 찾을만큼 똑똑하다고 생각합니다. (시작시 모든 인터페이스를 해결하면 올바르게 작동합니다. this._businessObject.SearchForObject(id)
올바른 클래스가 호출되고 오른쪽 값으로 채워지지만이 시점에서 개체를 반환 할 때 오류가 발생합니다.) 나는 SO를보고 있었고 예를 들어 KnownType(typeof(SomeObject))
속성과 같은 "갈 방법"을 발견했다. 하지만 TestController 내부를 설정하려고 할 때 인식되지 않습니다 (하지만 실제로 작동하더라도 내 실제 모델 클래스에 대한 참조가 필요하며이를 원하지 않습니다).
내 인터페이스를 serialize 가능하게 만들고 실제로 ISomeObject 구현이 무엇인지 컨트롤러에 알리지 않고 올바른 개체를 반환 할 수있는 방법이 있습니까?
감사
:
그런 다음 컨트롤러 클래스에서 재정의 JSON 방법 :
그리고 다음과 같이 사용하는 가장 편리한 방법은 기본 JSON 결과 동작을 무시하는 것입니다 정확한 에러/예외를 게시하십시오. 인터페이스를 직렬화 할 수없는 본질적인 이유가 없습니다. 얼마나 많은 컨트롤러 액션이'IEnumerable'을 반환하는지 생각하십시오. –
인터페이스는 직렬화 할 수 없습니다. 그것들은 단지 객체가 구현하는 계약 일뿐입니다. –
아마 내가 잘못 말한 것은 사실이지만 구현에 대해 알 필요없이 인터페이스를 구현하는 객체를 직렬화 할 수 있습니다. –