【问题标题】:Service method arguments, object identifiers vs object references服务方法参数、对象标识符与对象引用
【发布时间】:2020-08-04 22:43:22
【问题描述】:

我知道将对象传递给服务方法可能会更好,但是如果调用者在调用服务之前必须首先查找对象,情况仍然如此吗?如果是这样,为什么?

示例

假设我有一个 RoleService,它为给定的用户添加一个角色。假设 RoleService 是通过 Web 控制器或可能的 REST API 调用的。 Web 控制器将 userId 和 roleId 作为 Web 请求的输入。

使用这种服务方式会更好吗?

public void addRoleToUser(long userId, long roleId) {
    User user = userRepository.find(userId);
    Role role = userRepository.find(roleId);
    user.addRole(role);
}

还是这个?在这种情况下,Web 控制器显然需要在调用服务之前检索这两个对象。

public void addRoleToUser(User user, Role role) {
    user.addRole(role);
    userRepository.save(user);
}

【问题讨论】:

    标签: java spring rest web-services architecture


    【解决方案1】:

    无论是通过 Web 控制器还是 REST API 调用,传入的请求只会提供 2 个 ID,因此您必须在某处进行 find() 调用。

    您当然不能相信调用者拥有关于这两个对象的最新信息,而且如果您仍然只打算使用 ID,那么传输完整的对象是一种浪费。

    通常让服务 API 也是数据库事务边界(使用 @Transactional 注释的服务类或方法),因此最好让服务方法执行 find()addRole() 调用,所以它们都在单个数据库事务中执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 2015-03-27
      • 2016-09-29
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多