我有一个帐户注册页面,我有以下服务类:
因此,当用户注册时,我必须:
我正在使用spring MVC,所以必须在注册方法中完成。
现在,我的问题是,我应该注入/使用来自WITHIN的其他服务的userService的注册方法吗?
userService.register(....)
public class UserServiceImpl ... {
public void register(....) {
save(user);
roleService.associateTo(....);
emailService.sendRegistrationEmail(...);
}
}
OR
这是否使得事情过于耦合,我应该在控制器方法中分别进行这些调用,如:
public ModelAndView register(..., HttpServletRequest request, ...) {
..
userService.register(user);
roleService.associateTo(...);
emailService.sendRegistrationEmail(...);
}
我有点倾向于第二种方法。假设我想以批量方式创建或注册用户,调用注册表会做很多我可能不想做的事情,因为我是以批量方式进行的(这只是我想到的,也许是边缘情况?)
答案 0 :(得分: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开发是一件非常糟糕的事情 - 下次你想在注册过程中添加一个步骤时,你需要在所有地方添加它。
最终,您将提供一个服务,将所有步骤包装在一个方法中,就像您在第一个解决方案中或我上面提到的那样。
答案 1 :(得分:2)
我要加第四个;创建一个用户注册事件并听取它。
我至少会从主线代码中删除发送的电子邮件,并将其作为队列中的消息处理,或至少处理异步事件,以避免任何潜在的延迟问题。
(我也可能会对用户做一些事情,所以你可以在一次操作中创建一个角色的用户只是为了方便,但这是一个不同的问题,并且可以论证。)