Подтвердить что ты не робот

В приложении MVC, должен ли контроллер или модель обрабатывать доступ к данным?

У нас есть некоторые философские дебаты в нашей компании о том, где призывы к бизнес-логике должны выполнять операции CRUD.

Я считаю, что Модель должна состоять из вашей структуры данных и что контроллер должен нести ответственность за заполнение данных.

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

Он также считает, что любой вызов, который возвращает объект Json, должен происходить в модели, а не в контроллере. Модель вернет массив к контроллеру, который затем вернет это как объект Json.

Каковы разные плюсы и минусы для каждого и есть ли правильный или неправильный способ сделать это?

4b9b3361

Ответ 1

Вся бизнес-логика должна быть в МОДЕЛИ.

Помните, что ответственность каждого уровня такова:

  • Контроллер - мост между моделью и представлением. Решает, куда идти дальше.
  • Вид - отображает данные, собирает пользовательский ввод
  • Модель - бизнес-логика, интерфейс к хранилищу данных.

Одним из самых больших достижений является поддержка и (позднее) расширение. В общем:

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

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

"Он также считает, что любой вызов, который возвращает объект Json, должен произойти в модели, а не в контроллере. Модель вернет массив в контроллер, который затем вернет это как объект Json".

НЕТ. Модель никогда не должна форматировать данные. Он также не должен читать форматированные данные. Это загрязняет модель и переходит в уровень ада, где business logic = display logic.

JSON (входящий или выходящий) - это просто другое представление. Итак, выходите:

Data Store -> Model -> Controller -> View

Входит:

View -> Controller -> Model -> Data Store

Ответ 2

FYI, мой основной язык - PHP, поэтому вы можете взять все это с солью.

Логика бизнес-бизнеса в моделях с MVC и MVC должна находиться на уровне модели. И да, модель должна быть слоем, а не классом или объектом.

Большая часть указанной логики будет находиться в объектах , но часть из них окажется в услуги, которые должны быть похожими на структуры верхнего уровня на уровне модели, через которые слой представления (представления и контроллер) взаимодействует с уровнем модели.

Службы также должны облегчать взаимодействие между абстракциями хранения (data mappers, объекты доступа к данным, единицы работы и/или репозитории) и объектов домена. Эти структуры будут иметь дело с постоянным и временным хранением и иметь дело с целостностью данных.

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

Контроллеры (и эквивалентные структуры из других шаблонов MVVM и MVP) должны извлекать информацию из пользовательского запроса и изменять состояние уровня модели (путем работы с службами) и представления.

Если вы реализуете MVP или MVVM, то компоненты, подобные контроллеру, будут иметь дополнительные обязанности, включая передачу данных с модельного уровня для просмотра, но в классических шаблонах Model2 MVC предполагается, что представление активную структуру, которая запрашивает данные из уровня модели.

Что касается генерации JSON, это должно произойти в представлении. Представления должны содержать все (или большинство, в зависимости от того, как вы используете шаблоны) логику представления. Он должен получать информацию из уровня модели (либо напрямую, либо через посредников) и, основываясь на этой информации, генерировать ответ (иногда создавая его из нескольких шаблонов). JSON был бы просто другим форматом ответа.


В Rails-инфраструктуре, которая была выпущена в 2005-м, было огромное влияние (и в основном - отрицательное). Первоначальная цель этого заключалась в создании основы для прототипирования - для быстрого создания кода выброса. Для этого они упростили схему до такой степени, что разделение проблем было нарушено.

Они заменили модельный слой коллекцией активных структур записей, которые легко сгенерировали и объединили функции представления в контроллере, оставив шаблоны в качестве замены для полного просмотра. Это было идеальное решение для первоначальной цели, но когда оно начало распространяться в других областях, появилось большое количество неправильных представлений о шаблонах дизайна MVC и MVC, таких как "представление - это просто шаблон" и "модель ORM".к югу >

Ответ 3

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

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

Если вы пишете какой-либо код Linq в своих контроллерах, вы создаете зависимость, которая должна быть изменена, если ваша структура сайта изменится, и вы потенциально дублируете код доступа к данным. Но GetCustomer в модели все еще GetCustomer, независимо от того, где вы вызываете ее из своих контроллеров. Это имеет смысл?

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

Я не уверен в JSON. JSON - это просто альтернативное представление данных; если у вас есть метод утилиты, который может преобразовать ваши классы данных в JSON, вызовите GetCustomer из Модели и выполните преобразование в JSON в свой метод контроллера.

Ответ 4

Модель должна обрабатывать доступ к данным.

Из MSDN:

Модели. Объекты модели - это части приложения, которые реализуют логика для области данных приложения. Часто объекты модели извлекать и сохранять состояние модели в базе данных. Например, продукт объект может извлекать информацию из базы данных, работать с ней и затем записывать обновленную информацию обратно в таблицу Products в SQL База данных сервера.

Ответ 5

В MVC модель отвечает за обработку доступа к данным. Про является то, что весь код доступа к данным инкапсулируется логически моделью. Если вы включили код доступа к данным в контроллер, вы будете раздувать контроллер и разрушать шаблон MVC.