域实体应该调用存储库吗?
Should a Domain Entity call a repository?
我正在设计一个交付应用程序并尝试使用 Clean Architecture 和 DDD。在领域层的核心深处,我们有许多可配置的业务规则。例如,有确定货物的最佳承运人、确定运输方式、确定支付类型等的业务规则。每个业务规则都从数据库中选择数据,因此我打算使用 BizRule Repository。问题是,根据我对 DDD 原则的理解,领域实体(例如 Shipment)不应该调用存储库(例如 BizRuleRepository)。用例层应该是调用存储库的层。如果我采用这种方法,那么我将不得不将许多复杂的业务规则移动到用例层,我不确定这是否是最佳方法。在这种情况下,做一个例外并让域实体调用存储库是否有意义?提前谢谢你。
如果它只是为了阅读,应该没问题,也许使用 interface/service(也只有 1 种方法)表达对您的商店的所需查询,将您的实体与存储库分离可能会更清晰.
通过这种方式,您可以在测试期间轻松模拟查询,并且将来可以轻松地在其自身 class 中改进查找方法(或者您也可以为查找传递不同的 strategies/implementation)。
使用存储库写入实体内部时出现问题。
Should a Domain Entity call a repository?
一般来说,不会;实体(域关注点)直接与存储库(管道)通信没有意义。
埃文斯在组织他的书时,将这些想法分配到不同的章节
- 用软件表达的模型——描述实体
- 域对象的生命周期 -- 描述存储库
是语言问题;存储库通常具有集合或持久性语义,它们(通常)不是领域无处不在的语言的一部分。
也就是说,有一个漏洞; 领域服务 可以使用通用语言描述数据检索,并将该工作委托给应用程序或基础架构服务。
因此(暂时假设业务规则是一个 域 概念),您将拥有一个知道 哪个 的域实体它需要的业务规则,以及知道如何检索业务规则的域服务,然后是知道如何使用它的实体。
如果业务规则不是领域概念,那么一些工作会从实体转移到领域服务,但模式的核心保持不变——实体将参数传递给服务,服务 returns 实体理解的域值,实体决定如何在其当前处理中应用该值。
We can solve any problem by introducing an extra level of indirection
有点像shell游戏;在幕后,我们仍在使用管道;但是领域模型只看到了瓷器。
当你想对域逻辑进行单元测试而不拖入整个管道依赖项世界时,额外的间接层会非常方便:你用测试替身替换域服务。
我正在设计一个交付应用程序并尝试使用 Clean Architecture 和 DDD。在领域层的核心深处,我们有许多可配置的业务规则。例如,有确定货物的最佳承运人、确定运输方式、确定支付类型等的业务规则。每个业务规则都从数据库中选择数据,因此我打算使用 BizRule Repository。问题是,根据我对 DDD 原则的理解,领域实体(例如 Shipment)不应该调用存储库(例如 BizRuleRepository)。用例层应该是调用存储库的层。如果我采用这种方法,那么我将不得不将许多复杂的业务规则移动到用例层,我不确定这是否是最佳方法。在这种情况下,做一个例外并让域实体调用存储库是否有意义?提前谢谢你。
如果它只是为了阅读,应该没问题,也许使用 interface/service(也只有 1 种方法)表达对您的商店的所需查询,将您的实体与存储库分离可能会更清晰. 通过这种方式,您可以在测试期间轻松模拟查询,并且将来可以轻松地在其自身 class 中改进查找方法(或者您也可以为查找传递不同的 strategies/implementation)。
使用存储库写入实体内部时出现问题。
Should a Domain Entity call a repository?
一般来说,不会;实体(域关注点)直接与存储库(管道)通信没有意义。
埃文斯在组织他的书时,将这些想法分配到不同的章节
- 用软件表达的模型——描述实体
- 域对象的生命周期 -- 描述存储库
是语言问题;存储库通常具有集合或持久性语义,它们(通常)不是领域无处不在的语言的一部分。
也就是说,有一个漏洞; 领域服务 可以使用通用语言描述数据检索,并将该工作委托给应用程序或基础架构服务。
因此(暂时假设业务规则是一个 域 概念),您将拥有一个知道 哪个 的域实体它需要的业务规则,以及知道如何检索业务规则的域服务,然后是知道如何使用它的实体。
如果业务规则不是领域概念,那么一些工作会从实体转移到领域服务,但模式的核心保持不变——实体将参数传递给服务,服务 returns 实体理解的域值,实体决定如何在其当前处理中应用该值。
We can solve any problem by introducing an extra level of indirection
有点像shell游戏;在幕后,我们仍在使用管道;但是领域模型只看到了瓷器。
当你想对域逻辑进行单元测试而不拖入整个管道依赖项世界时,额外的间接层会非常方便:你用测试替身替换域服务。