首页 > 解决方案 > 在服务中使用多个服务或多个存储库?

问题描述

假设我们有两个实体,EntityA并且EntityB. 两个实体都有一个用于查询数据库的存储库,EntityARepository并且EntityBRepository. 他们也有服务,EntityAServiceEntityBService

现在里面有个方法EntityBService,也需要用到EntityA。这样做的正确方法是什么?

我可以看到直接使用存储库可能非常方便,但是当不仅有两个实体时,它似乎有点混乱。

是否有围绕该主题的通用设计模式或建议?

标签: springspring-bootspring-datadomain-driven-design

解决方案


TLDR;这取决于!

如果您尝试遵循领域驱动设计,我认为区分servicerepository. 有不同的定义可能在细节上有所不同,但我会坚持使用 Martin Fowler 的Repository定义:

(...) 存储库在域和数据映射层之间进行调解,就像内存中的域对象集合一样。(...)

服务

服务层从连接客户端层的角度定义了应用程序的边界 [Cockburn PloP] 及其可用操作集。它封装了应用程序的业务逻辑,控制事务并在其操作的实现中协调响应。

值得指出service的不仅仅是repository+ 业务逻辑。对于大多数简单的场景repository,只需要访问单个数据库,但是对于高级场景,创建单个实体可能需要访问多个数据库,所以repository角色是从service层中删除这个 woffle。

这是你可以想出的:

  1. 如果您尝试做的只是获取EntityARepository而没有任何与. 这是一个简单的例子:EntityBServiceEntityAEntityA

EntityBService对 执行操作EntityB,但它完全依赖于EntityA状态。

  1. 如果请求EntityAService涉及一些与. 这是一个简单的例子:EntityBServiceEntityAEntityA

EntityBService执行操作,EntityB如果EntityA不存在则需要稍后创建 - 创建涉及业务逻辑,例如检查是否允许(例如基于用户角色)。


推荐阅读