领域驱动设计(DDD):基于网关监控领域模型定义边界与聚合咨询

边界划分方案
先按业务能力拆分限界上下文作为一级逻辑边界,不同上下文之间仅通过ID关联,禁止直接依赖内部实现:
- 组织管理上下文:负责公司、项目的基础信息维护,属于全局基础数据域,和网关、采集的业务逻辑完全解耦
- 网关配置上下文:负责所有类型网关的定义、实例管理、专属子资源配置,不同网关类型的实现逻辑在上下文内部通过多态隔离
- 变量管理上下文:负责变量的配置、下发、生效校验,是独立的业务域,和网关配置的变更流程解耦
- 数据采集上下文:负责上报数据的接收、解析、存储,和配置类逻辑完全隔离
聚合设计方案
不需要把所有对象都设计为独立聚合。聚合的核心作用是保证边界内的业务规则强一致,只有具备独立生命周期、不需要和其他对象在同一事务内保证一致性的对象,才适合作为独立聚合的根实体。从属对象如果生命周期完全绑定某个根实体,且变更需要和根实体保持强一致,直接作为对应聚合内的子实体即可,不需要单独拆分聚合。
各上下文内的具体聚合设计如下:
- 组织管理上下文
- 公司聚合:根实体为
Company,包含公司基础属性,独立聚合 - 项目聚合:根实体为
Project,关联所属company_id,独立聚合,项目的生命周期不依赖公司的实时变更,无需和公司放在同一个聚合
- 公司聚合:根实体为
- 网关配置上下文
- 网关聚合:根实体为
Gateway,是上下文内唯一的聚合根,不同网关类型用多态实现,内部包含对应类型的专属子实体:Field-Device-Gateway类型:内部包含FieldDevice子实体集合,每个FieldDevice下包含关联的Source集合HTTP-Client-Gateway类型:内部包含HttpClient子实体集合,每个HttpClient下包含关联的Route集合
子实体的生命周期完全绑定网关,网关删除时子实体同步删除,强一致要求符合同聚合的设计原则,无需拆分为独立聚合。
- 网关聚合:根实体为
- 变量管理上下文
- 变量聚合:根实体为
Variable,独立聚合,关联字段包含company_id、project_id、gateway_id,以及对应网关类型所需的配置字段(如关联的field device ID、source ID等)
变量的配置、下发是独立的业务流程,不需要和网关的其他变更放在同一个事务中处理,拆分为独立聚合可大幅降低网关聚合的复杂度,避免并发冲突。
- 变量聚合:根实体为
跨聚合业务规则校验实现
针对「变量必须关联存在的公司、项目、网关才可创建/生效」的业务规则,采用「前置强校验+最终一致性兜底」的方案实现,无需破坏聚合边界:
- 创建/更新变量时的实时校验:变量的创建/更新接口在参数校验阶段,分别调用组织管理上下文、网关配置上下文的公共查询接口,校验传入的
company_id、project_id、gateway_id对应的实体均存在且处于可用状态,校验不通过直接拒绝请求 - 关联资源删除后的兜底处理:如果出现公司、项目、网关被删除的场景,通过领域事件异步处理关联变量的清理:
- 公司/项目/网关删除时,对应上下文发布
CompanyDeleted/ProjectDeleted/GatewayDeleted领域事件 - 变量管理上下文订阅上述事件,接收到事件后批量失效/删除关联对应ID的所有变量,保证业务规则的最终一致性
- 公司/项目/网关删除时,对应上下文发布
扩展优化建议
后续新增网关类型时,仅需要在网关配置上下文的网关聚合下新增对应类型的子类实现,无需修改其他上下文的逻辑,符合开闭原则。
内容的提问来源于stack exchange,提问作者Luuk Wuijster
相关产品推荐
相关产品推荐

