问候,私有方法在控制器
我对现在相当一些应用程序正在使用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()方法。这是更详细的,但似乎与我更好的分离。