2013-09-18 2 views
14

ранее, многие разработчики придерживаются мнения, что представление не должно напрямую связываться с моделью, как это делает большинство фреймворков.MVC: следует напрямую поговорить с моделью?

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

http://r.je/views-are-not-templates.html
http://www.tonymarston.net/php-mysql/model-view-controller.html
Model, View, Controller confusion
и
How should a model be structured in MVC?

большинство из этих статей цитирует блок из википедии, Модель-представление-контроллер, котировки является:

просматривать запросы модели, чтобы сгенерировать iate (например, в представлении указано содержимое корзины покупок). Представление получает свои собственные данные из модели. В некоторых реализациях контроллер может выдавать общую инструкцию для представления для себя. В других случаях представление автоматически уведомляется моделью изменений состояния (Observer), которые требуют обновления экрана.

ах, это из википедии, такого авторитетного сайта, это должно быть правильно!

но теперь, когда я открываю ссылку на wiki из MVC http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller, страница была отредактирована 14 сентября этого года (2013 год), и вышеприведенное предложение прошло.

новое определение для зрения:

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

теперь я смущен снова, новое определение говорит вид должен запросить данные из модели через контроллер ...

следует модель доступа вид прямо на земле?

+0

Вы должны спросить, что на http://programmers.stackexchange.com – JTC

+0

извините, но я нахожу много похожих тем на этом сайте и не нахожу ответа, поэтому я просто разместил его здесь ... –

+0

@ Статья в вики wiki исправлено. –

ответ

20

Ниже представлено представление зависимостей в классической архитектуре MVC. Вы заметите, что нет стрелки от контроллера для просмотра, потому что это новая добавка:

enter image description here
Источник: GUI architectures

И тогда есть зависимость карты, которая находится ближе к тому, что вы будете обычно см в "рамках MVC":

Passive View
Источник: Passive view

Конфигурация «пассивный вид»: не часть архитектуры MVC. В то время как он использует одни и те же имена, что на самом деле является вариацией на MVP шаблон (вы можете найти более длинное и детальное описание в this publication)

Нижняя линия: да, если вы реализуете MVC или MVC, как архитектуры, то ваши представления должны запрашивать информацию на уровне модели.

Кроме того, вы должны отметить, что это НЕ, что толкают так называемые «рамки mvc». В Rails-подобных фреймах нет представления. Вместо этого (поскольку исходная структура была создана для прототипирования), взгляды заменяются немыми шаблонами, и все обязанности представления вставляются во что-то, что они называют «контроллером».

В принципе, ИМХО, лучший способ назвать Rails-подобные узоры будут OLT: ORM-Logic-Template.

+0

Интересно, почему википедия меняет определение представления ..., чтобы привнести новое определение MVC? –

+2

Википедия - не какой-то монолитный источник знаний. Все изменения не являются людьми. И некоторые люди глупы. –

+0

Fowler ссылается на MVC, как графический интерфейс. Если это правильно, то скажите, что M MVC - это бизнес-правила, данные, логика и т. Д., Не так ли? – Maykonn

11

«Модель» - ваше основное приложение. Все, что может сделать ваше приложение, - это модель.
«Вид» предназначен для визуализации происходящего и предоставления пользовательского интерфейса.
«Контроллер» - это клей, необходимый для реагирования на события и инструктаж модели и просмотр того, что нужно делать.

Теперь, какие у вас есть варианты для связи между моделью и видом?

  1. Push: все данные, необходимые для представления, вставляются в него, как правило, с помощью контроллера.
  2. Pull: вид получает все необходимые данные, откуда он сам нуждается.

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

Лучшим вариантом является предоставление представления дескриптора, который позволяет ему разговаривать с моделью и получать все необходимые ей данные. Контроллер просто сообщает вид «Нам нужна форма XYZ сейчас, вот ручка, чтобы поговорить с моделью, иди!» и вид может выполнять свою работу.

+0

спасибо, что ответит! Я узнал от вас несколько новых моментов. Интересно, почему википедия меняет определение вида ... –

+1

@Cifer Поскольку их определение было неправильным, вот почему. – Yang

+1

@deceze Ваше заявление _ Контроллер просто сообщает о представлении «нам нужна форма XYZ сейчас, вот ручка, чтобы поговорить с моделью, идите!» _. Я никогда не думал о том, что контроллер передаёт маркер в модель. Вы углубили мое понимание MVC! Благодаря! – thegreendroid

0

Я думаю, что большинство цитат вокруг MVC, как правило, нормально, но я предполагаю, что вы говорите о ... Позвольте быть конкретным и на самом деле назвать его ... Microsoft View Controller. Поскольку они склонны всегда добавлять свой собственный немного (и хотя многие не согласны, на мой взгляд, я думаю, что в большинстве своем их намерения хорошо сформированы, но это дискуссия по другой теме).

Я просто хотел подчеркнуть, что Microsoft-View-Controller на самом деле является другим вариантом в теме Model-View-Controller.

Как я использую его следующим образом:

Я вообще отделить мои проблемы с использованием различных моделей, потому что хорошо позволяет быть тупым ... один из самых медленных частей любой системы доступа к данным, внимательно следил за полосой пропускания.Поэтому я твердо считаю, что это неправильно делать, как многие предполагают, поставив бизнес-логику в модели по 2 причинам:

  1. MVC (независимо от варианта) является методология развития, которая разработана, чтобы быть расширяемым и ремонтопригодны.
  2. В Microsoft-VC нет возможности подключить представление к нескольким моделям (если вы не используете ViewModels). Эта практика поощряется, и проблемы безопасности, связанные с подключением непосредственно к задним моделям, изобилуют. Так или нет, его обычно считают плохой практикой подключать представления непосредственно к моделям, и вместо этого вы должны подключить их к ViewModels.

MVC - это многоуровневая архитектура. Так сложите его. Под этим я подразумеваю, что EF выполняет свою работу по сопоставлению таблиц с классами и оставляет их в покое. Microsoft-VC заставляет людей применять шаблон дизайна (принцип Open/Close) к модели путем автоматического генерации кода с использованием классов «Partial». Таким образом, вы создаете свой собственный пустой частичный класс, а затем добавляете к нему свои метаданные. Это не очень хорошая идея добавить код здесь, поскольку он тесно связан с моделью. Вместо этого ...

Добавить слой репозитория с использованием шаблона репозитория. Это использует все ваши классы моделей, чтобы сделать базовый (очень простой) CRUD. Тогда ...

Добавить домен (бизнес) слой и сделать его называют слой хранилища, чтобы получить данные, он должен сделать бизнес-правил ... Тогда ...

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

По мере того, как вы развиваетесь в этом опыте, вы можете впоследствии добавлять интерфейсы между слоями по мере необходимости и легко применять хорошо известный шаблон IOC с помощью какой-либо формы DI.

Надеюсь, это поможет ... Но в целом тот факт, что MVC является многоуровневой архитектурой, означает, что добавление слоев - это то, что он предназначен для этого, не ограничивает себя работой только одним способом. Также помните, если вы слышите, как люди говорят, что многоуровневая архитектура N-Tier для больших систем - это просто глупо ... каждая система - большая система. Ни один бизнес не инвестирует потенциально, по меньшей мере, 100 тысяч долларов, чтобы разработать небольшую систему и оставить ее на этом (я знаю, что мне платят большие деньги за разработку таких систем, исходя только из моей зарплаты и налогов, которые работодатель должен платить выше и выше моя зарплата, я могу с уверенностью сказать, что любая компания, в которой работает более 2 разработчиков, уже прошла за 100 тыс. долларов в год на разработку так называемых «малых» систем). Все системы предназначены для роста, и чем раньше вы примете этот подход, тем проще будет поддерживать и расширять вашу систему.

1

Я думаю, что люди перепутали понятия, термины и практики. ТАК ОЧЕНЬ, что трудно даже общаться.

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

Затем их бизнес слой получает слилась с видом-моделью и, таким образом, с уровнем представления ...

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

По крайней мере, что я принимаю это ...

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