问候,
我已经开发了很多应用程序,现在使用MVC模式,无论是在Rails还是.Net中,我总是看到在控制器类中添加了一些私有方法。这些私有方法确实知道“如何”验证某些内容或“如何”为域模型创建视图模型。在我看来,这个逻辑正在泄漏,应该放在帮助器内或域模型本身。我总是喜欢“控制器应该知道该做什么,但现在该怎么做”这句话。似乎在课堂上添加了一堆私有方法会破坏它。
我希望有人对此事有一些有用的见解。
谢谢!
答案 0 :(得分:3)
我同意这个逻辑不应该是控制器的一部分。我在控制器中避免使用私有方法。如果我们以“how”为例创建域模型的视图模型,这个逻辑通常应该驻留在映射层中。
答案 1 :(得分:1)
我使用过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()方法。它更冗长,但似乎是对我更好的分离。