Java 如何连接一个不仅仅依赖于自身存储库的服务?
我正在开发一个标准的SpringBoot(带有SpringWeb和SpringData)RESTWeb服务,并陷入了这种情况 例如,如果我有两个实体:Java 如何连接一个不仅仅依赖于自身存储库的服务?,java,spring,spring-boot,Java,Spring,Spring Boot,我正在开发一个标准的SpringBoot(带有SpringWeb和SpringData)RESTWeb服务,并陷入了这种情况 例如,如果我有两个实体: 使用者 团队 他们之间有着多对多的关系。他们的服务怎么样 备选案文1: UserService依赖于UserRepository TeamService依赖于TeamRepository和UserRepository 备选案文2: UserService依赖于UserRepository TeamService依赖于TeamReposi
- 使用者
- 团队
- UserService依赖于UserRepository
- TeamService依赖于TeamRepository和UserRepository
- UserService依赖于UserRepository
- TeamService依赖于TeamRepository和用户服务
如果我在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可以包装由多个聚合组成的域模型。保持高内聚性
是规则。你能把最后的评论添加到你的答案中让它更清楚吗。谢谢。:)