2013-12-19 2 views
3

У нас есть решение с несколькими веб-проектами MVC и теперь добавление проекта WebApi, ориентированного на клиента.ASP.NET - одно решение, проекты MVC и WebApi, отдельные модели для каждого?

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

Каковы наилучшие методы обработки моделей в разных проектах?

Насколько я понимаю, модель в проекте WebApi будет использовать, например, некоторые атрибуты свойств, которые не имеют смысла для веб-приложения MVC. А также в качестве примера атрибут Display не имеет смысла для WebApi, но очень полезен в представлении.

Это заставляет меня думать, что я должен создавать отдельный набор моделей для WebApi, но также интересно, не хватает ли я чего-то.

Я понимаю, что это может быть вопрос, который может привести к ряду мнений, поэтому я в основном ищут то, что считается передовой практикой в ​​отрасли.

+0

Веб-API обычно используется для веб-сервисов. Это определенно хорошая практика для того, чтобы ваше обслуживание и ваше фактическое приложение были отдельными, поэтому для этого вам следует использовать разные проекты. Если вы хотите, чтобы они разрабатывались независимо, вы также должны разделить решения. – user3038092

+0

Мы уже отделили API от своего собственного проекта - мой вопрос заключается в том, следует ли использовать одну модель среди разных проектов. Создание единой общей библиотеки моделей по сравнению с отдельными для каждого проекта. – McCee

+1

Я бы использовал несколько проектных проектов, каждый из которых предназначался для этого. Таким образом, у вас есть более четкое разделение между сервисом и приложением (и, возможно, база данных). Но вы можете столкнуться с большим количеством кода, создав методы сопоставления, чтобы при необходимости сопоставить одну модель с другой. – user3038092

ответ

6

В моем решении, где у меня есть Web API и веб-приложение MVC, у меня есть ниже структуры

Модели: My Entity/Бизнес-объекты. Они создаются инфраструктурой Entity из моей базы данных. Они почти такие же, как моя структура db. Мои методы репозитория (для доступа к данным) возвращают либо один экземпляр/коллекцию экземпляров этих классов. Мой проект доступа к данным является отдельной библиотекой классов, которая упоминалась в других местах, как мой веб-апи проекта и т.д ..

Web API ViewModels: The ViewModels (ПОКО класс), специфичные для методов интерфейсов Web API/действий.

Веб-приложение MVC ViewModels: Модели просмотра (класс POCO), характерные для моих бритвенных представлений. Я даже унаследовал некоторые из них из моделей просмотра веб-API и добавил дополнительные свойства по мере необходимости.

+7

Объекты веб-api обычно не называются ViewModels (поскольку они не привязаны к представлению), а скорее всего модели или DTO (объекты переноса домена). – user3038092

+2

Термин Viewmodel используется как общий термин, поясняющий, что этот объект является специфичным для обслуживания этой конкретной функции (вид бритвы или вызов api). Но для этого может быть лучший термин. – Shyju

+0

С описанием решения, означает ли это, что у вас есть отдельный класс MappingExtensions для каждого проекта? (мы используем AutoMapper) – McCee

1

Я использую отдельный проект для DTO, так что проекты, которые должны их потреблять, не попадают в проблемы с круговыми ссылками.

Я бы хотел, чтобы проект WebApi отображал ваши модели в DTO. Если ваш проект MVC потребляет выход WebAPI, ему просто нужна ссылка на проект DTO. Это не позволяет вам напрямую ссылаться на проект WebAPI.

+0

Я согласен с тем, что сохранение DTO в отдельной сборке будет лучше всего в этом сценарии, а также то, как Джон Папа делает это на SPA-курс по множественному выбору. Также MVC может наследовать от DTO для целей ModelViews или делать ViewModel Manipulation ex: 'ViewData.Model = new SomeViewModel (SomeDTO)', а также синхронизирует DTO API и MVC. –

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