В нескольких проектах MVC, над которыми я работал, стало очевидно, что есть несколько проблемных контролеров, которые органически выросли в классы Бога - полубоги, каждый из которых находится в своей области, если хотите.
Этот вопрос может быть скорее вопросом «что и куда», но я думаю, что это важный вопрос в отношении SRP (принцип единой ответственности), DRY (не повторяйте себя) и краткости, «гибкости» "- и я недостаточно опытен (с этим шаблоном и общим дизайном), чтобы быть осведомленным об этом.
В одном проекте у нас есть NutritionController. Со временем он стал включать следующие действия (многие с их соответствующими методами GET, POST и DELETE):
Index (home controller)
ViewFoodItem
AddFoodItem
EditFoodItem
DeleteFoodItem
ViewNutritionSummary
SearchFoodItem
AddToFavorites
RemoveFromFavorites
ViewFavorites
Тогда у нас есть ExerciseController, который будет включать в себя множество похожих действий, таких как поиск и избранное действий. Должны ли они быть реорганизованы в их собственный контроллер, чтобы это было что-то вроде этого?
SearchController {
SearchExercise
SearchNutrition
//... etc
}
FavoritesController {
ViewNutritionFavorites
AddToNutritionFavorites
AddToExerciseFavorites
EditNutritionFavorites
EditExerciseFavorites
//... etc
}
Мне просто кажется, что если вы разделите их на отдельные контроллеры, на каком-то уровне вы вырастите невероятно большую зависимость для работы с информацией, которая вам понадобится. ИЛИ у вас будет полностью универсальное приложение для обработки, которое будет очень трудно обрабатывать, так как вам придется перепрыгивать через множество обручей, чтобы получить желаемый эффект (либо на уровне M, V, либо C).
Я думаю об этом неправильно? Например, должен ли я иметь общий объект Favorites, а затем позволить контроллеру решить, в какое представление его бросить?
* Извините за расшифровку аббревиатур - я делаю это на тот случай, если кто-нибудь еще сталкивается с этим вопросом и не знает, что это за вещи
EDIT:
Вся логика, которую я выполняю, в значительной степени обрабатывается на сервисных уровнях. Например, контроллер отправит «новый» FoodItem в сервис. Если он уже существует или произошла ошибка, служба отправит его обратно контроллеру.