ViewModel против доменных сущностей
Прежде чем я начну, я хочу сказать, что я знаю, что такое ViewModel и какова его цель, но этот сценарий делает его избыточным... пожалуйста, продолжайте читать:)
Я работаю над приложением ASP.NET MVC4 и столкнулся с некоторой головной болью в отношении PagedList, Domain Entities и ViewModels.
По сути, плагин PagedList.MVC плохо работает с AutoMapper, и я должен потерять лишнюю работу, чтобы заставить его работать так, как я этого хочу.
Но потом я подумал, нужен ли мне класс ViewModel, когда требуются все свойства рассматриваемой доменной сущности?
Какая польза от ViewModel, когда View требуется каждое отдельное свойство в вашем доменном объекте?
2 ответа
Это может быть вопросом мнения, мне нравится использовать модели представления (и DTO), которые дают следующие преимущества:
- Я уверен, что все данные, необходимые для просмотра, загружены, а не прокси и т. Д.
- При правильном создании DTO предоставляют намного меньший график для хранения в кеше (может не относиться к вашей настройке)
- Это позволяет моим моделям представлений сильно отличаться от объектов Домена, часто они являются составными и довольно разрозненными и могут свободно изменять их, не затрагивая другие части моего приложения.
Теперь, чтобы противостоять вышесказанному, и многие могли бы, вы могли бы работать напрямую с объектами вашего домена. Я бы, вероятно, порекомендовал бы это также, если вы считаете, что ваши модели представлений являются просто однозначными подобиями вашего домена, и вы не видите никакой выгоды в вышеприведенном.
Как обычно, это зависит от вашей настройки
- твоя команда
- что делает тебя продуктивным
- инструменты, использованные ORM, если вообще используются
- размер и продолжительность проекта
- опыт
- и т. д., и т. д.
Я просто хотел бы добавить, что для небольших проектов хорошо иметь собственный ViewModel и работать с ним. Позже вы можете отделить сущность, если она к ней обращается.
Многие разработчики добавляют новые слои, не взирая на плюсы и минусы, позже они начинают замечать отставание, а затем возникают сомнения. Сам MVC уже является разделением концерна.
Наличие отдельного DomainEntity решает другую проблему, когда пользовательский интерфейс больше не отображает 1-к-1 для объекта, рассмотрим следующее.
Version 1
Domain | Presentation
--------------------------------
User.FirstName | User.Name
User.LastName |
User.PositionTitle | User.PositionTitle
Пример демонстрирует, что домен и представление больше не отображаются 1-к-1. В будущем у вас могут быть модификации домена, такие как следующие:
Version 2
Domain | Presentation
--------------------------------
User.FirstName | User.Name
User.LastName |
Position.Title | User.PositionTitle
На основании приведенного выше примера (версия 2) обратите внимание, что презентация не была изменена. Наличие отдельной модели домена повышает стабильность интерфейса. Это может даже снизить стоимость изменений для сценариев рефакторинга.
Преимущество ViewModel
Прелесть ViewModel в том, что он отделяет ваш домен от презентации, это преимущество более очевидно при использовании в больших проектах, где разные разработчики работают с разными частями системы (например, с отдельной командой GUI)
одно небольшое изменение требует изменений во многих классах.
Это один из недостатков разъединения ваших сущностей, это создает дублирование кода. Дополнительное кодирование имеет огромную стоимость, и преимущества должны быть очевидными, чтобы того стоить.