問候,私有方法在控制器
我對現在相當一些應用程序正在使用MVC模式無論是在導軌或.Net和我總是看到控制器內添加了一點私有方法的工作類。這些私有方法確實知道如何驗證某些東西,或者如何創建視圖模型到域模型。在我看來,這個邏輯正在泄漏,應該放在助手或域模型本身。我總是喜歡這樣一句話:「控制器應該知道該怎麼做,但現在該怎麼做。」並且似乎在類中添加了一些私有方法來打破這一點。
我希望有人對此事有一些有用的見解。
謝謝!
問候,私有方法在控制器
我對現在相當一些應用程序正在使用MVC模式無論是在導軌或.Net和我總是看到控制器內添加了一點私有方法的工作類。這些私有方法確實知道如何驗證某些東西,或者如何創建視圖模型到域模型。在我看來,這個邏輯正在泄漏,應該放在助手或域模型本身。我總是喜歡這樣一句話:「控制器應該知道該怎麼做,但現在該怎麼做。」並且似乎在類中添加了一些私有方法來打破這一點。
我希望有人對此事有一些有用的見解。
謝謝!
我同意這個邏輯不應該是控制器的一部分。我在我的控制器中避免私有方法。如果我們以爲例,創建一個視圖模型到域模型這個邏輯通常應該駐留在映射層。
我已經使用了Spring MVC(3.0),我喜歡它如何構造servlet/web服務。
它具有:
每個@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()方法。這是更詳細的,但似乎與我更好的分離。