【问题标题】:Advice on how my services should be interacting关于我的服务应该如何交互的建议
【发布时间】:2012-05-12 20:32:16
【问题描述】:

我有一个账号注册页面,我有以下服务类:

  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 会做很多我可能不想做的事情,因为我是以批量方式做的(这只是我想到的,也许是它边缘案例?)

【问题讨论】:

    标签: java spring spring-mvc soa


    【解决方案1】:

    我会添加第三种解决方案:

    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 开发是一件可怕的事情——下次你想在注册过程中添加一个步骤时,你需要在所有地方添加它。

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

    【讨论】:

    • 你的解决方案很有趣,但它仍然让我编写了 2 种不同的方法......但我想情况证明了这一点。
    • 还有一件事,您会将此服务 (UserRegistrationService) 添加到与其他服务相同的文件夹中,还是应该创建一个像“聚合服务”这样的文件夹来包装其他服务?只是想要你的建议而已......
    • @Blankman:这取决于你。我会将UserServiceUserRegistrationService 放在同一个包中,另一方面它们代表不同的抽象级别...
    【解决方案2】:

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

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

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

    【讨论】:

    • 电子邮件服务实际上是写入队列,所以它只是将消息写入队列而不是发送出去。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    相关资源
    最近更新 更多