2014-06-25 4 views
0

У меня есть метод контроллера со следующей подписьюРазрешающая интерфейсы в WebAPI

[HttpGet] 
[Route("results")] 
public List<IResult> GetResults() 
{ 
    return repo.GetResults(); 
} 

Не удивительно, что я получаю исключение JSON .NET говоря JSON .NET не может решить IResult к конкретному типу. Есть ли способ предоставить JSON .NET конкретный класс (Result), поэтому мне не нужно менять певчие метода?

+0

Если я не понимаю ваш комментарий, это потребует от меня изменения сигнатуры метода. Я уже сделал это, но то, что я хотел бы сделать, это сделать какое-то сопоставление, например, в контейнере IoC, в котором говорится: «Всегда разрешать IResult для результата». – Brian

+0

Не то, чтобы это помогло, просто ссылка на аналогичный (в настоящее время не отвеченный) вопрос: http://stackoverflow.com/questions/24124176/mvc-web-api-binding-model-to-a-derived-class. – djikay

ответ

2

Кажется, что вы хотите сделать, это не настоящая инъекция зависимостей, а вместо этого вы хотите контролировать, как данные сериализуются. Это полностью находится под вашим контролем с использованием специального форматирования медиа-типа (http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters), однако сначала вам нужно удалить форматирование json по умолчанию (http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#json_media_type_formatter).

Это может быть сделано, однако это сделает вещи более хрупкими и, вероятно, не является решением, которое вы хотите. Он не будет работать, если клиент хочет xml (вы тоже можете заменить этот форматировщик). Но что еще более важно, что произойдет, если у вас есть две реализации интерфейса, зарегистрированных в вашем контейнере? Это вызывает другой вопрос: почему вы используете интерфейс как DTO? Интерфейс обычно определяет набор методов, которые должны быть реализованы потребителем. Я понимаю, что свойства также могут быть определены, но я не думаю, что это предполагаемое использование интерфейсов.

+0

Я согласен с тобой. Я бы не хотел удалять форматировщики по умолчанию, но это может быть единственным вариантом. Единственная причина, по которой я использовал интерфейсы вместо конкретных типов, - это то, как устанавливаются репозитории, и это хорошо работает для тестирования с макетными данными. Однако это не относится к контроллерам. Единственной хорошей причиной для использования интерфейсов было бы избежать необходимости конвертировать все в конкретные типы. – Brian