关于我的服务应该如何交互的建议

时间:2012-05-12 20:32:16

标签: java spring spring-mvc soa

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

  1. userService
  2. roleService
  3. emailService
  4. 因此,当用户注册时,我必须:

    1. 在db
    2. 中创建用户
    3. 将用户添加到特定角色
    4. 向用户发送电子邮件
    5. 我正在使用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(...);
      
      }
      

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

2 个答案:

答案 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)

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

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

(我也可能会对用户做一些事情,所以你可以在一次操作中创建一个角色的用户只是为了方便,但这是一个不同的问题,并且可以论证。)