Должен ли я повторно использовать модели просмотра в разных представлениях?

Я заметил, что у меня есть мнения, которые нуждаются в такой же информации, как и другие. Но иногда вам нужно 5 свойств модели представления, а иногда только 2.

Вы делитесь такой моделью просмотра по многим представлениям или создаете отдельную модель представления для каждого представления или, возможно, предпочитаете стратегию наследования или композиции?

Для меня есть некоторые недостатки для совместного использования моделей просмотров:

  1. Принцип наименьшего сюрприза: странно заполнять только 2 свойства 5 модели представления и получить исключение для ссылки на ссылку, потому что вы не хотите запрашивать дополнительные данные из базы данных. Когда модель представления имеет 5 свойств, я ожидаю, что все будет заполнено. Исключения составляют правило.
  2. Разделение проблем/принцип единой ответственности: модель представления захламлена на сложных сайтах, потому что вы должны удовлетворить различные потребности для каждой точки зрения. Если логика также связана с ее усложнением.

Как вы думаете? Как вы справляетесь с такими обстоятельствами?

Ответ 1

В проекте, над которым я работаю, у каждого представления есть свой собственный ViewModel, однако у нас также есть CollectionViewModels, которые разделяются/ссылаются на несколько моделей представлений.

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

TL;DR: я бы использовал только модели просмотра, если все случаи использования используют ViewModel одинаково. Т.е. все они используют одни и те же свойства и т.д.

Ответ 2

Люди, как правило, имеют разные философии ViewModels, основанные на их перспективе их использования. ViewModels - это клей между представлением и моделью, и люди, как правило, основывают свой ответ на том, с какого из двух концов они предпочитают держать более жесткими.

  • Если вам нравится, что ваши модели/объекты данных более жесткие, вы, как правило, привязываете ViewModel ближе к модели/данным, т.е. У вас будет одна ViewModel, которая используется в нескольких представлениях и пусть ViewModel определит, какие свойства для получения информации о том, как вы хотите обрабатывать загрузку данных (и откладывать такие вещи, как изображения или другие свойства с большой нагрузкой и т.д.).
  • Если вы хотите, чтобы ваши представления были более жесткими, вы привяжете ViewModel ближе к View, т.е. имеете отдельный ViewModel для каждого представления и позволяете объектам модели/данных обрабатывать такие вещи, как syncronization, при переходе от представления к представлению.

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

Ответ 3

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

Ответ 4

Обычно я использую ViewModels. Насколько я понимаю, преимущества использования моделей представления: (a) безопасность в том, что свойства, которые должны быть скрыты, и (б) разделение проблем между бизнес-и презентационными уровнями. (б) выполняется одинаково при совместном использовании моделей представлений.

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

Ответ 5

Определенно один ViewModel per View, imho.

По мере того, как ваше приложение будет усложняться, общие ViewModels будут стремиться к росту, и не очень удобно передавать объект с 50 свойствами в представление, когда все, что ему нужно, - это одно свойство.

Кроме того, иногда вам может понадобиться добавить дополнительные свойства в ViewModel, которые абсолютно специфичны для вашего представления и что вам не нужно в других представлениях. Скажем, у вас есть класс CSS, который зависит от свойств из ViewModel. Вместо написания if else в вашем представлении вы создаете свойство в ViewModel, которое возвращает правильный класс css на основе любых бизнес-правил, которые у вас есть. Таким образом, вы делаете представление как можно более тонким, и с помощью выделенной ViewModel вы не делите имя класса CSS с представлениями, которые на самом деле не заботятся об этом.

Ответ 6

Я использую Entity Framework с кодом First, поэтому мои классы домена должны оставаться довольно жесткими, поскольку они будут сопоставлены с базой данных sql.

В некоторых представлениях используется только один объект с прямой привязкой, и это просто отлично, поэтому я использую один и тот же объект уровня домена. Если для этого объекта требуется дополнительная информация (например, два поля пароля), я буду использовать композицию. "Композиция должна быть предпочтительной по наследованию", поэтому, если вы можете использовать композицию, сделайте это, как правило, как дополнительные свойства, композицию можно использовать.

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

Ответ 7

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