Asp.net-Mvc

上帝控制器 - 如何防止它們?

  • March 20, 2013

在我一直從事的一些 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 級別)。

我在想這個錯誤的方式?例如,我是否應該有一個通用的收藏夾對象,然後讓控制器決定將它扔到哪個視圖?

*抱歉拼出首字母縮略詞 - 我這樣做是為了以防其他人遇到這個問題並且對這些東西是什麼一無所知

編輯: 我執行的所有邏輯都在服務層中處理。例如,控制器會將“新”FoodItem 發送到服務。如果它已經存在,或者它有錯誤,該服務會將它冒泡回控制器。

我會根據責任分解你的第一個清單:

家庭控制器

  • 指數

食品項目控制器

  • 查看食品項目
  • 添加食品項目
  • 編輯食物項
  • 刪除食品項
  • 搜尋食品

營養控制器

  • 查看營養總結

收藏夾控制器

  • 添加到收藏夾
  • 從收藏夾中刪除
  • 查看收藏夾
  • 搜尋收藏夾

Django的 MVC 方法是將職責分離到“應用程序”中,每個應用程序都有自己的模型、控制器,甚至在必要時使用模板。你很可能會有一個食品應用程序、一個營養應用程序、一個搜尋應用程序和一個收藏夾應用程序。

編輯:OP提到搜尋對每個控制器都更具體,所以我做了這些動作。然而,搜尋也可能只是一個通用的全域事物,所以在這些情況下,一個 SearchController 就可以了。

引用自:https://stackoverflow.com/questions/1024227