В нескольких проектах 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).
Я думаю об этом неправильно? Например, должен ли я иметь общий объект "Избранное", а затем позволить контроллеру решить, к какому представлению его нужно переместить?
* Извините за то, что написано аббревиатуры - я делаю это, если кто-то еще сталкивается с этим вопросом и не знает, что это за вещи
EDIT: Вся логика, которую я выполняю, в значительной степени обрабатывается в слоях службы. Например, контроллер отправит "новый" FoodItem в службу. Если он уже существует или произошла ошибка с ним, служба запустит его обратно в контроллер.