2017-02-12 4 views
0

Я создаю немного API в asp.net. Он связан с MVC webapp. Я намерен использовать webapp для использования собственного API вместо того, чтобы создавать 2 бэкэнда, которые делают то же самое.Как использовать один ViewModel для всех операций CRUD в WebApi

Я немного стараюсь, чтобы попытаться сохранить мой дублирующий код до минимума, когда дело доходит до создания модели для использования в API для входящих действий (Post, Put) и «outgoing» (get).

У меня есть класс Event, он содержит свойства, которые легко сериализовать в JSON и несколько сложных типов. Я создал модель под названием EventViewModel (уместно ли ее еще назвать модель в API?) С дополнительными свойствами, чтобы получить Name s из сложных типов.

В идеале я хотел бы повторно использовать эту модель для всего, но когда дело доходит до определения [Required] тегов, моя логика ломается ...

я сначала думал использовать [Bind(Include() Exclude()] на каждом из API действия. Это похоже на жизнеспособное решение?

Какие еще решения используют люди?

Спасибо!

ответ

1

Вот несколько мыслей.

Я бы использовал отдельные контроллеры для просмотра (Controller) и api (ApiController), так как мы говорим о двух разных представлениях данных. Я бы не использовал контроллер как api, так как оба возвращали разные типы. Контроллер api использует коды состояния по-другому. Например. ApiController.Delete возвращает statuscode 204 No Content, в то время как контроллер возвращает код состояния 200 Ok с представлением.

Можете вызывать модели для Контроллера ViewModels и для ApoController DTO. В любом случае они просто простые объекты. Не ставьте логику в эти объекты, кроме проверки (которую вы можете протестировать с помощью ModelState) и не используйте объекты сущности.

Не используйте модели/dto для нескольких целей по той причине, что вы уже столкнулись. Просто используйте простые объекты и используйте их только один раз, сохраняйте их просто. В этом случае, если вы хотите изменить что-то, что знаете, оно не нарушит ваше приложение.

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

Но если вы настаиваете на повторном использовании объектов, вы можете не использовать ModelState.Validate в Api's. Я думаю, что в этом случае тэг [required] игнорируется, но я не уверен. Что касается объектов, я бы не использовал JsonIgnore/Xmlignore, но вместо этого задавал значения по умолчанию. В этом случае эти свойства опущены при сериализации. Легко использовать объекты для POST и GET.

[DefaultValue(0)] 
    public int Id { get; set; } = 0; 

Использование репозиториев. Вы можете вызвать репозитории в обоих контроллерах, как в контроллере api. Здесь вы действительно можете сохранить код.

Для Api (не CRUD) Я предпочитаю писать специализированные запросы linq, которые возвращают анонимные объекты и выделяют их в dto. Это дает много преимуществ. Иногда я использую расширения (на IQueryable) для сохранения кода.

Возможно, вы захотите использовать что-то вроде automapper для сохранения кода, но я бы не рекомендовал это.

+0

Не то, что я хотел услышать, но хороший ответ. Я решил, что мне, возможно, придется создавать несколько моделей/контроллеров для разных сервисов. Спасибо. Я использую Automapper. Мне любопытно, почему вы не порекомендовали бы его. До сих пор я прекрасно проводил время. –

+0

На самом деле, я никогда не использовал automapper, но мне кажется, что это добавляет сложности в приложение. –