代码之家  ›  专栏  ›  技术社区  ›  AHS441

服务层和控制器中的代码分离

  •  0
  • AHS441  · 技术社区  · 7 年前

    我已经为重置密码和我的应用程序的其他部分编写了代码, 我想把服务层从dao和控制器中分离出来; 我的控制器代码是:

    @RequestMapping(value = "", method = RequestMethod.PUT)
    public ResponseModel resetPassword(@Valid @RequestBody AuthenticationRequestModel authenticationRequestModel, HttpServletRequest request) {
        String ip = WebUtils.getClientIp(request);
        Optional<SecuritySMS> securitySMS = securitySMSService.getLastValidSMS(authenticationRequestModel.getMobile());
        if (!securitySMS.isPresent()) {
            return new ResponseModel(messages.get("sms.security.expired"), ResponseModel.ResponseStatus.ERROR);
        }
        SecuritySMS sms = securitySMS.get();
        if (!sms.isConfirmed()) {
            return new ResponseModel(messages.get("sms.security.expired"), ResponseModel.ResponseStatus.ERROR);
        } else if (!sms.getIp().equalsIgnoreCase(ip)) {
            return new ResponseModel(messages.get("sms.security.ip.changed"), ResponseModel.ResponseStatus.ERROR);
        }
        Optional<User> user = userService.findByMobile(sms.getMobile());
        if (!user.isPresent()) {
            return new ResponseModel(messages.get("sms.reset.user.nonexistent"), ResponseModel.ResponseStatus.ERROR);
        }
    
        userService.updatePassword(user.get(), authenticationRequestModel.getPassword());
        return authHelper.loginWithHttpResponse(authenticationRequestModel);
    }
    

    我对将代码移动到服务层感到困惑;上面的方法正确吗?或者某些代码(例如下面的代码)必须移动到服务层吗?如果我把这个代码移到服务层,我怎么才能得到响应呢?布尔值(不可接受,因为我想向用户返回正确的消息)、字符串或异常?;

    String ip = WebUtils.getClientIp(request);
    Optional<SecuritySMS> securitySMS = securitySMSService.getLastValidSMS(authenticationRequestModel.getMobile());
    if (!securitySMS.isPresent()) {
        return new ResponseModel(messages.get("sms.security.expired"), ResponseModel.ResponseStatus.ERROR);
    }
    SecuritySMS sms = securitySMS.get();
    if (!sms.isConfirmed()) {
        return new ResponseModel(messages.get("sms.security.expired"), ResponseModel.ResponseStatus.ERROR);
    } else if (!sms.getIp().equalsIgnoreCase(ip)) {
        return new ResponseModel(messages.get("sms.security.ip.changed"), ResponseModel.ResponseStatus.ERROR);
    }
    Optional<User> user = userService.findByMobile(sms.getMobile());
    if (!user.isPresent()) {
        return new ResponseModel(messages.get("sms.reset.user.nonexistent"), ResponseModel.ResponseStatus.ERROR);
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Alain Cruz    7 年前

    MVS只是一种简化,并不是一种完美的方法。这就是为什么它提出了这么多类似于这个问题的问题。

    • 模型应该包含任何逻辑吗?

    因此,确实,您在控制器中进行决策,但是在服务中管理这些决策会使解决方案复杂化。所以,我就把它放在那里,不管怎样,最后,除了你和你的团队之外,没有人会对这个代码做出贡献,所以如果你对它感到满意,那就好了。

    但是,如果要移动代码,我建议使用异常。在我看来,服务应该只返回所需的模型或资源。最好使用异常来处理错误。