spring - 在服务中使用多个服务或多个存储库?
问题描述
假设我们有两个实体,EntityA
并且EntityB
. 两个实体都有一个用于查询数据库的存储库,EntityARepository
并且EntityBRepository
. 他们也有服务,EntityAService
和EntityBService
。
现在里面有个方法EntityBService
,也需要用到EntityA
。这样做的正确方法是什么?
- 应该直接
EntityBService
使用吗?EntityARepository
- 应该
EntityBService
使用EntityAService
?
我可以看到直接使用存储库可能非常方便,但是当不仅有两个实体时,它似乎有点混乱。
是否有围绕该主题的通用设计模式或建议?
解决方案
TLDR;这取决于!
如果您尝试遵循领域驱动设计,我认为区分service
和repository
. 有不同的定义可能在细节上有所不同,但我会坚持使用 Martin Fowler 的Repository定义:
(...) 存储库在域和数据映射层之间进行调解,就像内存中的域对象集合一样。(...)
和服务:
服务层从连接客户端层的角度定义了应用程序的边界 [Cockburn PloP] 及其可用操作集。它封装了应用程序的业务逻辑,控制事务并在其操作的实现中协调响应。
值得指出service
的不仅仅是repository
+ 业务逻辑。对于大多数简单的场景repository
,只需要访问单个数据库,但是对于高级场景,创建单个实体可能需要访问多个数据库,所以repository
角色是从service
层中删除这个 woffle。
这是你可以想出的:
- 如果您尝试做的只是获取
EntityARepository
而没有任何与. 这是一个简单的例子:EntityBService
EntityA
EntityA
EntityBService
对 执行操作EntityB
,但它完全依赖于EntityA
状态。
- 如果请求
EntityAService
涉及一些与. 这是一个简单的例子:EntityBService
EntityA
EntityA
EntityBService
执行操作,EntityB
如果EntityA
不存在则需要稍后创建 - 创建涉及业务逻辑,例如检查是否允许(例如基于用户角色)。
推荐阅读
- c - 使用变量作为文件名写入C中的文件
- python - 如何使用“json”模块在 Plotly 中实现一个带有 json 类型数据的表?
- css - 如何在css中设置span中的分词
- html - 电子邮件中的负边距
- php - 未定义属性:图片上传后 Illuminate\Http\UploadedFile::$name
- observable - 使用 vegalite 和 observable 将列的名称移动到 x 轴
- json - 如何在播放 json 中将嵌套的 Json 字符串转换为 Json 结构
- node.js - 无法将具有本地依赖关系的 node.js 应用程序部署到 Heroku
- r - 将“X%”格式的百分比读入 R
- php - 当我从 mysql 数据库中获取数据时,它每次都会创建新行而不是单行