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()方法。这是更详细的,但似乎与我更好的分离。