![]() |
1
7
一般来说,没有;对于实体(即 领域 关注点)直接与存储库(即管道)通信。 埃文斯在整理他的书时,将这些想法分配到不同的章节
这是一个语言问题;存储库通常具有集合或持久性语义,这些语义(通常)不是 无处不在的语言 域的。 也就是说,有一个环孔; 域服务 可以使用无处不在的语言描述数据检索,并将该工作委托给应用程序或基础设施服务。 所以(假设目前业务规则是 领域 概念),您将拥有一个域实体 哪一个 它需要的业务规则,以及知道如何检索业务规则的域服务,以及知道如何使用它的实体。 如果业务规则是 不 域概念,然后一些工作从实体转移到域服务,但模式的核心保持不变——实体将参数传递给服务,服务返回实体理解的域值,实体决定如何在其当前处理中应用该值。
这有点像空壳游戏;在隐蔽处,我们仍在使用管道;但领域模型只能看到瓷器。 当您想在不拖拽整个管道依赖关系的情况下对域逻辑进行单元测试时,这种额外的间接层非常方便:您可以用一个测试双精度替换域服务。 |
![]() |
2
0
如果只是为了阅读,那么应该可以,也许可以更简洁一些,有一个接口/服务(也只有一个方法)将所需的查询表达到您的存储中,将您的实体与存储库分离。 通过这种方式,您可以在测试期间轻松地模拟查询,并且将来可以在自己的类中轻松改进查找方法(或者您也可以为查找传递不同的策略/实现)。 当您使用存储库在实体内部写入时,会出现问题。 |
![]() |
Tony Raimo · 域实体是否应该调用存储库? 7 年前 |
![]() |
Seb · DDD只读存储库返回“值对象” 7 年前 |
![]() |
tlt · 使用嵌套对象和大集合进行聚合根优化 7 年前 |
![]() |
PatrickSJ · DDD,状态对象/值对象 7 年前 |
![]() |
msmani · DDD更改聚合根id 7 年前 |
![]() |
DuskMcDusk · 逻辑和性能中的聚合根冲突 7 年前 |