Пару дней назад Дерик Уитакер опубликовал статью, в которой затронул вопрос, который меня уже давно интересовал: должна ли бизнес-логика существовать в контроллерах?
До сих пор все демонстрации ASP.NET MVC, которые я видел, предоставляют доступ к репозиторию и бизнес-логику в контроллере. Некоторые даже добавляют туда валидацию. В результате получаются довольно большие и раздутые контроллеры. Действительно ли это способ использования инфраструктуры MVC? Похоже, это закончится большим количеством дублированного кода и логики, распределенной по разным контроллерам.
asp.net-mvc
design-patterns
controller
business-logic
Кевин Панг
источник
источник
Ответы:
Бизнес-логика действительно должна быть в модели. Вы должны стремиться к толстым моделям, худым контроллерам.
Например, вместо:
Я бы предпочел:
Это предполагает, что налог рассчитывается внешней службой, и требует, чтобы ваша модель знала об интерфейсах с вашими внешними службами.
Это сделает ваш контроллер примерно таким:
Или что-то вроде того.
источник
Мне нравится диаграмма, представленная Microsoft Patterns & Practices . И я верю в пословицу: «Картинка стоит тысячи слов».
источник
Это интересный вопрос.
Я думаю, это интересно, что большое количество примеров приложений MVC на самом деле не соответствует парадигме MVC в том смысле, что полностью помещает «бизнес-логику» в модель. Мартин Фаулер указал, что MVC не является шаблоном в смысле «Банды четырех». Скорее всего , это парадигма , что программист должен добавить шаблоны для , если они создают нечто большее , чем игрушка приложения.
Итак, краткий ответ заключается в том, что «бизнес-логика» действительно не должна находиться в контроллере, поскольку контроллер имеет дополнительную функцию работы с представлением и взаимодействиями с пользователем, и мы хотим создавать объекты только с одной целью.
Более длинный ответ заключается в том, что вам нужно немного подумать над дизайном уровня вашей модели, прежде чем просто перемещать логику от контроллера к модели. Возможно, вы сможете обрабатывать всю логику приложения с помощью REST, и в этом случае дизайн модели должен быть достаточно ясным. Если нет, вы должны знать, какой подход вы собираетесь использовать, чтобы ваша модель не раздувалась.
источник
Вы можете проверить это замечательное руководство Стивена Вальтера, в котором показана проверка с помощью уровня обслуживания .
источник
Бизнес-логика не должна содержаться в контроллерах. Контроллеры должны быть максимально тонкими, в идеале следовать скороговорке:
Дополнительно контроллеры могут содержать некоторую логику приложения.
Так где же мне разместить свою бизнес-логику? В модели.
Что такое модель? Это хороший вопрос. См. Статью Microsoft Patterns and Practices (слава AlejandroR за отличный поиск). Здесь есть три категории моделей:
Конечно, MVC - это парадигма, которая бывает разных видов. Здесь я описываю MVC, занимающий только верхний уровень, см. Эту статью в Википедии.
источник
Если вы используете инжекторы зависимостей, ваша бизнес-логика перейдет к ним, и, следовательно, вы получите аккуратные и чистые контроллеры.
источник