Пара вопросов о шаблонах моделей asp.net MVC
Я новичок в MVC.
Я прочитал этот короткий бит, подробно описывающий три способа работы с моделью представления в MVC:
http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx
Суть этого мне кажется, что:
Метод 1, вытащите объект из базы данных и используйте его в качестве модели представления. Быстро и просто, но если вам нужны данные из нескольких таблиц, вы полностью облажались (я не могу обойтись без метода 2).
Метод 2, создайте класс, который имеет ссылки на несколько объектов, и используйте его в качестве модели представления. Таким образом, вы можете получить доступ ко всему, что вам нужно. В статье говорится, что когда представления усложняются, они разрушаются из-за несоответствия импеданса между объектами модели домен / вид... Я не понимаю, что это значит. Несоответствие импеданса в гугле вернуло много вещей, суть в том, что вы представляете вещи базы данных, используя объекты, и вещи не отображаются чисто, но у вас, вероятно, возникнет эта проблема даже с методом 1. Не уверен, что я отсутствует. Мне также кажется, что создание класса для каждого представления для получения нужных данных не является идеальным с точки зрения обслуживания, и я не уверен, что у вас есть выбор.
Метод 3, я все еще разбираюсь в этом, но я не совсем понимаю, почему их пример флажка не сработает в методе 2, если вы добавили bool addAdditional к своему классу, который не был связан с моделью предметной области. Метод 3, кажется, говорит вместо того, чтобы возвращать материал домена напрямую, просто извлеките свойства, которые вам конкретно нужны, что, я думаю, лучше, но будет сложнее поддерживать, так как вам понадобятся некоторые большие конструкторы, которые делают this.x = domain.x
, this.y = domain.y
и т.п.
Я не понимаю конструктора, в частности, почему используется интерфейс, но продолжу работать над ним.
Редактировать: Я только что понял, что это на самом деле не вопрос, мой вопрос, мое мышление правильно?
2 ответа
Проблема, с которой я столкнулся с № 2, заключается в том, что мне нужно сделать одну из следующих двух вещей:
Включите каждое поле в каждый объект в форме - те, которые не будут отображаться, должны быть включены, но скрыты.
Включите только определенные поля, которые мне нужны, но используйте AutoMapper или что-то подобное, чтобы сопоставить эти поля с реальными объектами.
Так что с #2 я вижу несоответствие между тем, что я хочу сделать, и тем, что я должен сделать. Если мы перейдем к #3, это несоответствие будет устранено (насколько я понимаю, кратко рассмотрев его). Это также устраняет проблему, заключающуюся в том, что определенный хакер может передавать значения, такие как поля идентификатора или аналогичные, при использовании метода № 2, что, если я не буду очень осторожен, может быть записано в мое хранилище данных. Другими словами, можно обновить что-либо на любом из объектов, если только вы не будете очень осторожны.
С помощью метода № 3 вы можете использовать AutoMapper или аналогичный инструмент для грязной работы по сопоставлению пользовательского объекта с объектами хранилища данных, не беспокоясь о проблемах безопасности / импедансе, выявленных методом № 2 (см. Комментарий для получения дополнительной информации о проблемах безопасности с № 2).
Вы, вероятно, правы в отношении несоответствия импеданса, присутствующего в обоих методах 1 и 2 - оно обнаруживается везде, где вы переходите между объектами в коде и объектами БД с реляционным отображением. Джефф Этвуд пишет об этом и цитирует эту статью, которая является фантастическим обсуждением всего, что связано с объектно-реляционным отображением или "Вьетнамом информатики". То, что вы в конечном итоге будете делать, - это взвесить все за и против всех этих подходов и выбрать тот, который звучит так, как будто он наилучшим образом соответствует вашим потребностям, а затем понять, что вы выбрали неправильный. Или, может быть, вам повезло больше, чем мне, и вы можете сделать это правильно с первого раунда. В любом случае, это проблема волосатости.