在服务中使用多个服务或多个存储库?

tsc*_*904 6 spring domain-driven-design spring-data spring-boot

假设我们有两个实体,EntityAEntityB。两个实体都有一个存储库来查询数据库,EntityARepository并且EntityBRepository. 也有为他们俩提供的服务,EntityAServiceEntityBService.

现在 中有一个方法EntityBService,它也需要使用EntityA. 这样做的正确方法是什么?

  • 应该直接EntityBService使用EntityARepository吗?
  • 应该EntityBService使用EntityAService?

我可以看到直接使用存储库可能会非常方便,但如果不仅有两个实体,它似乎也会变得有点混乱。

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

Krz*_*cki 12

太长了;这取决于!

如果您尝试遵循领域驱动设计,我认为区分service和是个好主意repository。有不同的定义,细节上可能有所不同,但我会坚持使用 Martin Fowler 的Repository定义:

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

服务

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

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

这是你可以想到的:

  1. 如果您想要做的只是获取而没有任何与 相关的业务逻辑,请直接使用EntityARepositoryin 。这是一个简单的例子:EntityBServiceEntityAEntityA

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

  1. 如果请求涉及一些与 相关的业务逻辑,则使用EntityAServicein 。这是一个简单的例子:EntityBServiceEntityAEntityA

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