2

問候,私有方法在控制器

我對現在相當一些應用程序正在使用MVC模式無論是在導軌或.Net和我總是看到控制器內添加了一點私有方法的工作類。這些私有方法確實知道如何驗證某些東西,或者如何創建視圖模型到域模型。在我看來,這個邏輯正在泄漏,應該放在助手或域模型本身。我總是喜歡這樣一句話:「控制器應該知道該怎麼做,但現在該怎麼做。」並且似乎在類中添加了一些私有方法來打破這一點。

我希望有人對此事有一些有用的見解。

謝謝!

回答

3

我同意這個邏輯不應該是控制器的一部分。我在我的控制器中避免私有方法。如果我們以爲例,創建一個視圖模型到域模型這個邏輯通常應該駐留在映射層。

1

我已經使用了Spring MVC(3.0),我喜歡它如何構造servlet/web服務。

它具有:

  1. 控制器
  2. 命令對象
  3. 驗證對象

每個@RequestMappings(在控制器中公開的方法)的充當web服務。一個HttpRequest將進入,傳遞給正確的請求映射,映射到命令對象,然後進行驗證。

是這樣的:

GetUserCommand { 
    int userId; 
    public Map execute() { 
     Map result = new HashMap(); 
     result.put("user", new UserService().get(userId)); 
     return result; 
    } 
} 

Controller { 
    @RequestMapping(value="/user") 
    public ModelAndView handle(GetUserCommand cmd) { 
     new GetUserCommandValidator().validate(cmd); //checks userid is > 0 or something 
     return new ModelAndView("userView", cmd.execute()); 
    } 
} 

需要注意的是HTTP請求的參數映射到使用反射GetUserCommand對象是很重要的。所以必須有一個FrontController來解決這個問題,並且找出將請求轉發給哪一種方法。

這裏關鍵的是參數,驗證,執行邏輯和視圖的選擇被分成不同的組件。

您還可以使用IoC構建具有所需服務的命令對象。我最終決定將Command對象分解爲一個Parameters對象和Command對象。 Parameters對象包含userid,而Command對象使用Parameters(和UserService)實例化幷包含execute()方法。這是更詳細的,但似乎與我更好的分離。