首页 > 解决方案 > 如何连接不仅仅依赖于自己的存储库的服务?

问题描述

我正在开发一个标准的 Spring Boot(带有 Spring Web 和 Spring Data)Rest Web 服务并遇到了这种情况。

例如,如果我有两个实体:

他们有一个多对多的关系。他们的服务看起来如何?

选项1:

选项 2:

我在考虑选项 2,因为每个存储库都通过其各自的服务进行接口,但以下问题来自于此:

如果我希望服务只公开 DTO,并且需要我的 TeamService 中的用户实体,以便使用 Hibernate 进行多对多工作(我不仅需要参考 id)。我必须做变通方法或从 UserService 公开实体。

什么是更清晰的解决方案,或者我的逻辑是否混淆了?

编辑:

一些上下文:

如果我需要 TeamService 中的 addUserToTeam(Integer userId, Integer teamId) 之类的方法,我需要通过 id 获取用户实体,以便将其添加到用户的团队列表中。

标签: javaspringspring-boot

解决方案


It depends. 取决于您的业务用例..规则...

之间Team是否User存在某种所有者?

在将用户推入内部之前,您的企业是否需要创建团队?还是让用户以独立的方式创建?

也许当您必须创建一个用户时,您必须为他分配一个团队..也许不是..

想象一下,您必须创建一个Team之前添加的Users内容,您现在可以将Team其视为一个聚合概念(查看域驱动设计聚合)。

DDD 聚合是可以被视为单个单元的域对象集群。

等等这些对象:

  • 实体/值对象:团队,用户
  • 存储库:团队存储库
  • 服务:团队服务

所以“在这种情况下”不需要USerService or UserRepo. 每次您想要添加/删除/更新用户时,您都将通过Team对象/聚合来完成。因此新的注册User将通过

team.addUser(user);
teamRepository.update(team team)

如果现在这两个概念是完全独立的,您可以将它们视为 2 个单独的聚合,并且两者都有自己的存储库。

关于服务作为团队和用户是相关的概念,有 2 个服务可能是矫枉过正。

单个服务之间保持生命周期和一致性TeamUsers听起来更合适。

所以 :

  • 实体/VO:团队、用户
  • 回购:TeamRepository,UserRepository
  • 服务:XXXService(XXX替换为您选择的名词)

我只是说这one service = one aggregate不是规则......服务是门面,门面可以包装由多个聚合组成的域模型。Keep cohesion high是规则。


推荐阅读