Java 如何连接一个不仅仅依赖于自身存储库的服务?

Java 如何连接一个不仅仅依赖于自身存储库的服务?,java,spring,spring-boot,Java,Spring,Spring Boot,我正在开发一个标准的SpringBoot(带有SpringWeb和SpringData)RESTWeb服务,并陷入了这种情况 例如,如果我有两个实体: 使用者 团队 他们之间有着多对多的关系。他们的服务怎么样 备选案文1: UserService依赖于UserRepository TeamService依赖于TeamRepository和UserRepository 备选案文2: UserService依赖于UserRepository TeamService依赖于TeamReposi

我正在开发一个标准的SpringBoot(带有SpringWeb和SpringData)RESTWeb服务,并陷入了这种情况

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

  • 使用者
  • 团队
他们之间有着多对多的关系。他们的服务怎么样

备选案文1:

  • UserService依赖于UserRepository
  • TeamService依赖于TeamRepository和UserRepository
备选案文2:

  • UserService依赖于UserRepository
  • TeamService依赖于TeamRepository和用户服务
我考虑的是选项2,因为每个存储库都通过其各自的服务进行连接,但由此产生了以下问题:

如果我希望服务只公开DTO,并且需要TeamService中的一个用户实体,以便多对多使用Hibernate(我需要一个引用,而不仅仅是id)。我要么做变通,要么从UserService公开一个实体

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

编辑:

一些背景:


如果我在TeamService中需要像addUserToTeam(Integer userId,Integer teamId)这样的方法,我需要按id获取用户实体,以便将其添加到用户团队列表中

存储库绑定到数据库结构

这些服务与您需要的业务逻辑相关


例如,用户服务可以包括获取团队或用户的方法(如果您需要属于相同业务逻辑的东西)。

这取决于
。取决于您的业务用例。。规则

团队
用户
之间是否存在某种所有者

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

也许当你必须创建一个用户时,你必须给他分配一个团队。。也许不是

假设您必须先创建一个
团队
,然后才能将
用户
添加到您现在可以将
团队
视为一个聚合概念(查看域驱动的设计聚合)

DDD聚合是可以作为单个单元处理的域对象集群

因此,对于这些对象:

  • 实体/价值对象:团队、用户
  • 存储库:团队存储库
  • 服务:团队服务
所以“在这种情况下”不需要
USerService或UserRepo
。每次您想要添加/删除/更新用户时,您都将通过
团队
对象/聚合进行操作。因此,新
用户的注册将通过

team.addUser(用户);
teamRepository.update(团队)
如果现在这两个概念都是完全独立的,您可以将它们视为两个独立的聚合,并且它们都有自己的存储库

关于团队和用户的服务是相关的概念,拥有两个服务可能会有些过分

一项维护
团队
用户
生命周期和一致性的单一服务听起来更合适

因此:

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

我只是说
one service=one aggregate
不是一条规则。。。服务是facade,facade可以包装一个由多个聚合组成的域模型。
保持高内聚性是规则。

为什么teamService需要依赖这两个聚合?它们的功能是互斥的。如果我在TeamService中需要像addUserToTeam(Integer userId,Integer teamId)这样的方法,我需要通过id获取用户实体,以便将其添加到用户团队列表中。但是这样我就失去了UserService控制如何保存/更新/…的想法。。。来自UserRepository的用户,因为我将拥有来自TeamService的其他UserRepository访问权限。服务不是CRUD的记住每一层的责任。存储库,持久化并检索数据。服务是业务逻辑。设想一个名为createUser()的业务方法,但也可以是getAllUsersFromTeam(teamName)。这在很大程度上取决于你把限制放在哪里。但是这个概念认为服务只有save/update/。。。正如你所说的,你只需要把逻辑推到下一层。这不是一个好主意。是的,服务不仅仅是CRUD,但我仍然觉得我不应该在UserService之外公开存储库。您不需要在UserService之外公开存储库,但请记住一般规则,存储库连接到服务而不是其他层,服务调用存储库,从来没有其他服务。这不是我所学的。服务通过调用在不同实体/域对象上定义业务逻辑的其他服务来形成业务逻辑,但在我的例子中,用户和团队是两个独立的聚合,可以独立存在。我的操作与UserService中的用户和TeamService中的团队的业务逻辑有关。关系的所有者可以说是团队,因为团队由用户组成。团队不需要用户,用户也不需要在团队中。实际上,这取决于可用操作的数量。如果它是一个简单的CRUD,那么仅仅拥有一个少于10个操作的外观就可以在不引入不良耦合或更少内聚的情况下完成工作。。我不确定我是否理解你(我知道什么是外表)。你能用一个例子或更具描述性的解释来详细说明吗?我只是说,
one service=one aggregate
不是一个规则。。。服务是facade,facade可以包装由多个聚合组成的域模型。保持
高内聚性
是规则。你能把最后的评论添加到你的答案中让它更清楚吗。谢谢。:)