2013-05-03 2 views
44

Я начинаю изучать WebAPI и найти себе делать вещи, что имеет смысл в проекте MVC, но не может иметь смысл в.Имеет ли смысл иметь ViewModels в Webapi?

Обычно в проекте MVC я делаю ViewModels и использовать его в качестве параметра или передать их обратно с точки зрения.

Поскольку в webapi нет представлений, я думаю, что нет смысла иметь параметр ViewModel в качестве параметра.

Мне интересно, может быть, если бы у меня был только параметр параметров моих доменов EF (сначала код) и помещал аннотации данных поверх них. Обычно я помещал аннотации поверх свойств модели представления, так как мне понравилось это в домене.

Однако то, что мешает мне сделать это, я не на 100% понимаю, как мой сайт MVC будет работать.

Подходит ли сайт MVC просто к просмотру, а затем вы используете JQuery для вызова своего веб-приложения или просто вызываете методы действия MVC, которые непосредственно вызывают те же методы, которые вызовет Webapi?

Если это второй способ, я скорее добавлю аннотации данных к своей модели просмотра, но затем я помещаю те же самые объекты как в домене EF, так и в виртуальные машины, и это кажется излишним.

ответ

21

Терминология в сторону, имея модели для привязки к прежнему использованию. Они просто не являются технически ViewModels больше, поскольку вы правы, нет никаких взглядов. Но они определенно все еще используются. Использование их позволяет использовать атрибуты в свойствах вашей модели и позволяет повторно использовать их в вашем API, если это необходимо. Также помните, что если вы используете свои объекты напрямую, WebAPI будет моделировать привязку всех параметров к ним, которые соответствуют по имени, даже если вы этого не хотели.

Кроме того, модели сущностей являются представлениями ваших необработанных данных, но Модели, используемые для привязки к ним, являются фиксированным контрактом, который запросы API должны удовлетворять, чтобы успешно обрабатывать запрос. Значения, которые могут закончиться развертыванием нескольких моделей сущностей к моменту выполнения вашей реализации, не сохраняются в хранилище данных вообще.

+0

Ya это одна из причин, почему я не люблю положить свои аннотации на самой EF. Думаю, я должен использовать viewModel, но просто называть его чем-то другим DataModel? Я все еще не понимаю, как будет работать весь сайт. Например, у меня будет метод Add. Мобильные устройства и веб-сайт могут добавить. Должен ли сайт MVC вызывать метод webapi? В этом случае это имеет смысл. Но как насчет Edit Case на мобильном телефоне снова, кажется, имеет смысл называть webapi, но на сайте кажется, что вы предпочитаете использовать mvc, чтобы получить обратную ссылку, которая привязана, а затем вернуться к этому представлению. – chobo2

+0

Я столкнулся с той же проблемой, и решение, к которому я пришел, состоит в том, что не имеет смысла использовать мой сайт на MVC для отправки/получения данных и использования WebApi для других (отправляемых с сайта MVC). Основное преимущество WebApi заключается в том, чтобы позволить внешним активам напрямую использовать ваши данные/бизнес-правила через API. Если у вас уже есть сайт MVC в том же проекте, зачем заставлять его проходить через WebApi для взаимодействия с вашим доменом, если вы можете напрямую использовать MVC? И я согласен, что несколько другое изменение имени сделает его более ясным. InputModel? RequestModel? Это просто терминология, и на самом деле это то же самое. –

+0

Я предполагаю, что вы создадите отдельный проект для своего сайта mvc и получите его в том же решении, что и webapi. Я знаю, что у webapi могут быть контроллеры mvc, но я думаю, что это больше похоже на то, что вы показываете документацию и тому подобное о вас api для пользователя. – chobo2

6

Если вы пытаетесь создать систему на основе REST, то понятие ViewModel и View может быть очень полезным. Вы можете довольно точно сопоставить понятие Resource с ViewModel и представление View.

Если вы остановитесь на мгновение о том, как выглядит изображение на сайте MVC. Это HTML-документ. Документ, содержащий кучу семантической информации, заголовка, тела, разделов, абзацев, таблиц и т. Д. Он не должен содержать информацию о стиле. Это работа веб-браузера и CSS. Люди путаются, когда начинают думать о HTML как пользовательском интерфейсе. Это не должен быть пользовательский интерфейс, это содержание пользовательского интерфейса.

Представления представляют собой конкретную реализацию контента модели просмотра с использованием некоторого типа носителя, который может быть передан по кабелю. Что такое тип носителя, зависит от того, какой клиент вы пытаетесь удовлетворить.

+0

Так что да? –

3

В настоящее время мы работаем над аналогичным проектом, который использует ASP.Net MVC и ASP.Net Web Api.

Мы используем ASP.Net MVC для создания глобальной структуры наших страниц. Затем наша реализация MVVM javascript вызывает веб-api для заполнения возвращенных данных в моделях просмотра клиента. Для этого наша api возвращает модель просмотра, которая соответствует ожидаемому интерфейсу.

Я думаю, что ваши модели просмотра api будут отличаться от MVC ViewModels (которые не являются ViewModels с точки зрения MVVM).

Это зависит от вашего использования api. Например, для внутреннего использования вам не всегда нужно избегать отображения вашей модели домена. Таким образом, вы избежите сопоставлять модель в ViewModel и увеличивать производительность. Но в случае, если вам нужно преобразовать некоторые свойства в свои модели, viewModels значительно помогут вам структурировать ваш код в связном виде.

Поскольку в webapi нет представлений, я думаю, что нет смысла иметь параметр ViewModel в качестве параметра.

Я бы сказал, что ваш api потребляется вашими взглядами в конце, имеет смысл иметь ViewModel.

ли сайт MVC просто выплюнуть обратно взгляды Simples, а затем использовать Jquery для вызова WebAPI или вы просто вызывать методы действий MVC, которые непосредственно просто называют одни и те же методы WebAPI бы назвали?

Это просто вопрос выбора здесь. Вы можете вызвать действие MVC для получения сгенерированных представлений (в html), или вы можете вызывать WebApi для получения ответов JSON/XML, которые затем будут привязаны к вашему javascript-коду в ваших представлениях.

1

Чтобы добавить то, что говорили другие, использование валидации также полезно для проверки. Вы можете пометить свои классы аннотациями данных, включая любые требования проверки. В действиях вашего контроллера вы все равно можете использовать ModelState, чтобы принудительно выполнить проверку и вернуть соответствующие сообщения через HttpRequestException или просто HttpResponseMessage.

20

Мое предложение после того, как займет слишком много времени, работая с этой 'вещи':

BindingModels для привязки данных (MVC или API)

ViewModels для взглядов на MVC (вы можете иметь некоторые MVC страниц внутри вашего api, поэтому хорошо иметь место для этого места, это может быть документация, встроенная страница, что угодно. Если нет представления, то вы можете иметь нулевые ViewModels). Одно из преимуществ этого заключается в том, что вы можете в своих представлениях /web.config имеют ссылку пространства имен ViewModels и это не будет загрязнено вашими ресурсами api.

ResourceModel для веб-ресурсов api. В webapi вложенные ресурсы также являются ресурсами, которые идут в любом месте дерева, которое не так распространено на mvc, поэтому называть их ресурсами имеет большой смысл.

Если вы хотите получить ресурс, вы можете использовать свою модель ресурсов. Помните, что вы получаете то же самое, что и вы отправляете обратно.

Если вам нужна пользовательская привязка для ввода (это должен быть ваш сценарий по умолчанию), у вас есть свои модели привязки.

Если у вас есть просмотр mvc, для целей администрирования, документации, независимо от того, используйте свои ViewModels.

Если у вас есть страница формы на mvc, вы можете использовать свою BindingModel также на контроллере POST. Нет необходимости иметь другую модель для публикации в MVC или WEBAPI. Специально, когда модельное связующее или форматирующее устройство могут понимать и сопоставлять одну и ту же модель привязки с использованием тех же аннотаций данных.

Иногда вы хотите создать модель привязки с ресурсом и некоторыми дополнительными полями. Наследование - ваш друг.

Иногда вы хотите создать модель привязки с более чем одним ресурсом и (необязательно, дополнительные поля) Ресурсы в качестве свойств - ваш друг.

В мире MVC вы также можете использовать концепцию «Ресурс», но это гораздо реже. Это пригодится, когда у вас есть MVC и Web Api в одном проекте.

Если вам нужны дополнительные комментарии к любому элементу (например, структура папок, пространства имен и т. Д.), Просто дайте мне знать. Я более чем счастлив поделиться своим опытом.

О, и я забыл, что стратегия картографии стоит исследования. Я лично делаю свои собственные сопоставления, но наличие этой логики в одном месте бесценно.

EDIT: Очень наивный пример

ContactViewModel{ 

    string Name {get;} 
    string LastName {get;} 
    List<Country> AvailableCountries {get;} 
    Country Country {get;} 
    bool IsAdmin {get;} 

} 

ContactBindingModel{ 

    string Name {get;set;} 
    string LastName {get;set;} 
    int Country {get;set;} 

} 

ContactResourceModel{ 

    string Name { get;set;} 
    string LastName {get;set;} 
    Country Country {get;set;} 
    string IsAdmin {get;} 

} 
+0

Мне нравится ваш подход к этому.Какие типы соглашений и структуры именования вы используете для своих файлов классов? Это довольно типичная классическая модель просмотра в MVC для «MyModelNameViewModel». Используете ли вы те же принципы, что и для BindingModels и ResourceModels? И/или вы используете отдельные папки для разных типов моделей? – jimutt

+0

Я делаю что-то подобное. У меня есть ViewModels для передачи назад к представлениям и привязки моих запросов к FormModels, так как чаще всего я привязываюсь к форме с веб-страницы (MVC), хотя я мог бы называть их BindingModels также для таких вещей, как WebAPI, и иметь их более универсально названный. Мое соглашение об именах, как правило, похоже на '[Контроллер] [Действие] ViewModel'. Поэтому я мог бы получить что-то вроде «PeopleEditFormModel» –

+1

@jimutt В последнее время я много инвестировал и много разбирался в структуре папок функций, а не контроллеров/моделей/представлений. и т. д. До того, как я использовал '[Model] Resource' для ресурсов,' [Controller] [Action] ViewModel' для режимов просмотра и '[Command] BindingModel' для моделей привязки (где команда - это предполагаемое действие, например CancelOrder, CreateModel, и т. д.) Обычно Command = ActionName. –

Смежные вопросы