首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >域实体应该调用存储库吗?

域实体应该调用存储库吗?
EN

Stack Overflow用户
提问于 2017-12-19 23:55:41
回答 2查看 3.2K关注 0票数 3

我正在设计一个运输应用程序,并试图使用清洁架构和DDD。在领域层的核心部分,我们有许多可配置的业务规则。例如,有业务规则用于确定最优运输载体、确定运输方式、确定支付类型等。每个业务规则从数据库中选择数据,因此我计划使用BizRule仓库。问题是,根据我对DDD原则的理解,域实体(例如托运)不应该调用存储库(例如BizRuleRepository)。用例层应该是调用存储库的层。如果我采用这种方法,那么我将不得不将许多复杂的业务规则移到用例层,我不确定这是否是最好的方法。在这种情况下,创建异常并让域实体调用存储库是否有意义?提前谢谢你。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-20 01:49:33

域实体应该调用存储库吗?

一般来说,没有;实体(这是一个域关注点)直接与存储库(它是管道)通信是没有意义的。

埃文斯在整理他的书时,把这些想法分配给了不同的章节。

  • 一种用软件表达的模型--描述实体
  • 域对象的生命周期--描述存储库

这是语言的问题;存储库通常具有集合或持久性语义,而这些语义(通常)并不是该领域普遍存在的语言的一部分。

也就是说,存在一个循环漏洞;域服务可以使用无处不在的语言描述数据检索,并将工作委托给应用程序或基础设施服务。

因此(假设目前业务规则是一个域概念),您将拥有一个知道自己需要哪个业务规则的域实体,以及一个知道如何检索业务规则的域服务,然后是知道如何使用它的实体。

如果业务规则不是域概念,那么一些工作将从实体转移到域服务,但是模式的核心仍然相同--实体将参数传递给服务,服务返回实体所理解的域值,实体决定如何在当前处理中应用该值。

我们可以通过引入额外的间接方向来解决任何问题。

这有点像一个贝壳游戏;在封面下,我们仍在使用管道;但领域模型只看到瓷器。

当您想要单元测试域逻辑而不拖拽管道依赖关系的整个世界时,这一额外的间接层非常方便:您将域服务替换为test double。

票数 8
EN

Stack Overflow用户

发布于 2017-12-20 00:07:33

如果只是为了阅读,它应该是可以的,也许它可以更干净地使用一个接口/服务(也只有一个方法)来向您的存储区表示所需的查询,从而使您的实体与存储库分离。通过这种方式,您可以在测试期间轻松地模拟查询,而且在将来,查找方法可以在它自己的类中很容易地得到改进(或者您也可以为查找传递不同的策略/实现)。

当您使用存储库在实体内部编写时,就会出现问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47896909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档