知识卡片

复杂多表查询不放进领域层:查询不需要领域逻辑约束

普通读书笔记卡

内容

领域层存在的意义是承载核心业务逻辑和业务规则约束,但书中特别提醒一类例外情况:涉及多表关联的复杂查询,因为这类查询本身不需要经过任何领域逻辑或业务规则的校验,不建议把它们塞进领域层的领域模型里实现。合适的做法是通过应用层的应用服务来完成这类查询——既可以用传统的多表关联SQL查询方式,也可以采用CQRS(命令查询职责分离)读写分离的方式来实现。这个例外背后的判断标准很清晰:判断一段逻辑该不该放进领域层,关键不是”这段代码是否在处理业务数据”,而是”这段代码是否承载了需要被保护的业务不变性和规则约束”——纯粹的数据查询、组装、展示,即使涉及复杂的多表关联,也只是在读取和呈现数据,不涉及任何业务规则的执行或校验,因此不属于领域层该操心的范畴,把它们留在应用层反而更贴合”应用层负责组合编排、领域层负责核心业务规则”这条分工原则,也避免了领域层因为塞进了大量与业务规则无关的查询代码而变得臃肿。

参考来源

- 位置:第14章《如何用DDD设计微服务代码模型》"14.2.2 各层代码目录","2. 应用层"(源文件:_epub-src/OEBPS/Text/chapter4-3-2-2.xhtml) - 结论依据:原文说明"对于多表关联的复杂查询,由于这种复杂查询不需要有领域逻辑和业务规则约束,因此不建议将这类复杂查询放在领域层的领域模型中。你可以通过应用层的应用服务采用传统多表关联的SQL查询方式,也可以采用CQRS读写分离的方式完成数据查询操作",直接支撑本卡片结论。 - 原始内容:对于多表关联的复杂查询,由于这种复杂查询不需要有领域逻辑和业务规则约束,因此不建议将这类复杂查询放在领域层的领域模型中。你可以通过应用层的应用服务采用传统多表关联的SQL查询方式,也可以采用CQRS读写分离的方式完成数据查询操作。