控制器中的私有方法

时间:2011-03-09 16:40:27

标签: ruby-on-rails asp.net-mvc model-view-controller design-patterns

问候,

我已经开发了很多应用程序,现在使用MVC模式,无论是在Rails还是.Net中,我总是看到在控制器类中添加了一些私有方法。这些私有方法确实知道“如何”验证某些内容或“如何”为域模型创建视图模型。在我看来,这个逻辑正在泄漏,应该放在帮助器内或域模型本身。我总是喜欢“控制器应该知道该做什么,但现在该怎么做”这句话。似乎在课堂上添加了一堆私有方法会破坏它。

我希望有人对此事有一些有用的见解。

谢谢!

2 个答案:

答案 0 :(得分:3)

我同意这个逻辑不应该是控制器的一部分。我在控制器中避免使用私有方法。如果我们以“how”为例创建域模型的视图模型,这个逻辑通常应该驻留在映射层中。

答案 1 :(得分:1)

我使用过Spring MVC(3.0),我喜欢它是如何构建servlet / web服务的。

它有:

  1. 控制器
  2. 命令对象
  3. 验证者对象
  4. 每个@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()方法。它更冗长,但似乎是对我更好的分离。