1

我有一个帐户注册页面,并且我有以下服务类:

  1. 用户服务
  2. 角色服务
  3. 电子邮件服务

所以当用户注册时,我必须:

  1. 在数据库中创建一个用户
  2. 将用户添加到特定角色
  3. 给用户发电子邮件

我使用的是spring MVC,所以这必须在注册方法中完成。

现在,我的问题是,我应该从 userService 的 register 方法中注入/使用其他服务吗?

userService.register(....)

public class UserServiceImpl ... {

   public void register(....) {

      save(user);
      roleService.associateTo(....);
      emailService.sendRegistrationEmail(...);
   }
}

或者

这是否使事情过于耦合,我应该在控制器方法中分别进行这些调用,例如:

public ModelAndView register(..., HttpServletRequest request, ...) {

    ..

    userService.register(user);
    roleService.associateTo(...);
    emailService.sendRegistrationEmail(...);

}

我有点倾向于第二种方法。假设我想以批量方式创建或注册用户,调用 register 会做很多我可能不想做的事情,因为我是以批量方式做的(这只是我想到的,也许是它边缘案例?)

4

2 回答 2

3

我会在组合中添加第三种解决方案:

public class UserRegistrationService ... {

    public void register(....) {
        userService.save(user);
        roleService.associateTo(....);
        emailService.sendRegistrationEmail(...);
    }

    public void registerInBatch(...) {
        foreach(...) {
            userService.save(user);
            roleService.associateTo(....);
        }
    }
}

在重用代码方面,在控制器中执行几个步骤是一个糟糕的主意。如果您想通过 REST 或任何其他接口公开相同的逻辑,您最终将尝试直接调用控制器或将所有步骤复制到另一个地方。C&P 开发是一件可怕的事情——下次你想在注册过程中添加一个步骤时,你需要在所有地方添加它。

最终,您将提出一个服务,将所有步骤包装在一个方法中,就像您的第一个解决方案或我上面建议的那样。

于 2012-05-12T20:54:52.037 回答
2

我要加第四个;创建一个用户注册事件并监听它。

我至少会从主线代码中完全删除发送的电子邮件,并将其作为队列中的消息处理,或者至少作为异步事件处理,以避免任何潜在的延迟问题。

(我也可能对用户做一些事情,这样您就可以在单个操作中创建一个具有角色的用户,只是为了方便,但这是一个不同的问题,无论哪种方式都有争议。)

于 2012-05-12T21:40:31.783 回答