java - 如何连接不仅仅依赖于自己的存储库的服务?
问题描述
我正在开发一个标准的 Spring Boot(带有 Spring Web 和 Spring Data)Rest Web 服务并遇到了这种情况。
例如,如果我有两个实体:
- 用户
- 团队
他们有一个多对多的关系。他们的服务看起来如何?
选项1:
- UserService 依赖于 UserRepository
- TeamService 依赖于 TeamRepository 和UserRepository
选项 2:
- UserService 依赖于 UserRepository
- TeamService 依赖于 TeamRepository 和UserService
我在考虑选项 2,因为每个存储库都通过其各自的服务进行接口,但以下问题来自于此:
如果我希望服务只公开 DTO,并且需要我的 TeamService 中的用户实体,以便使用 Hibernate 进行多对多工作(我不仅需要参考 id)。我必须做变通方法或从 UserService 公开实体。
什么是更清晰的解决方案,或者我的逻辑是否混淆了?
编辑:
一些上下文:
如果我需要 TeamService 中的 addUserToTeam(Integer userId, Integer teamId) 之类的方法,我需要通过 id 获取用户实体,以便将其添加到用户的团队列表中。
解决方案
It depends
. 取决于您的业务用例..规则...
之间Team
是否User
存在某种所有者?
在将用户推入内部之前,您的企业是否需要创建团队?还是让用户以独立的方式创建?
也许当您必须创建一个用户时,您必须为他分配一个团队..也许不是..
想象一下,您必须创建一个Team
之前添加的Users
内容,您现在可以将Team
其视为一个聚合概念(查看域驱动设计聚合)。
DDD 聚合是可以被视为单个单元的域对象集群。
等等这些对象:
- 实体/值对象:团队,用户
- 存储库:团队存储库
- 服务:团队服务
所以“在这种情况下”不需要USerService or UserRepo
. 每次您想要添加/删除/更新用户时,您都将通过Team
对象/聚合来完成。因此新的注册User
将通过
team.addUser(user);
teamRepository.update(team team)
如果现在这两个概念是完全独立的,您可以将它们视为 2 个单独的聚合,并且两者都有自己的存储库。
关于服务作为团队和用户是相关的概念,有 2 个服务可能是矫枉过正。
单个服务之间保持生命周期和一致性Team
,Users
听起来更合适。
所以 :
- 实体/VO:团队、用户
- 回购:TeamRepository,UserRepository
- 服务:XXXService(XXX替换为您选择的名词)
我只是说这one service = one aggregate
不是规则......服务是门面,门面可以包装由多个聚合组成的域模型。Keep cohesion high
是规则。
推荐阅读
- python - 将字符串的特定部分转换为大写?
- java - Android:上传多个文件以百分比显示进度条
- batch-file - 如何使用批处理将数据写入文本文件
- code-formatting - 在 Cloud9 IDE 中如何美化 Javascript 字符串中的 HTML 代码?
- nlp - spaCy:固定令牌的词性
- python - 使用带有 numpy 的重复索引时如何指定列 [用于 np.add.at()]
- python - 在 Tkinter 中隐藏一个按钮
- node.js - 强大的处理没有上传文件错误
- oracle - 授予角色什么 Oracle 权限,以便用户可以查看 Oracle SQL Developer 模式中的表
- regex - 正则表达式:如何增量匹配重复模式