跳转到内容

子域与核心域(Subdomain)

用途:决定哪些模块值得投入建模、哪些应当外购或简化时查阅

子域是对问题空间(业务本身)的分解结果:把整个业务领域切分成若干相对独立的部分,每一部分承载一类业务能力。子域属于业务视角,与解空间里的限界上下文(模型视角)不是同一层东西。

三类子域按“是否构成竞争优势”区分:

类型 特征 投入策略
核心域(Core) 决定业务竞争力,规则复杂且持续演进,做不好直接影响经营结果 最强的人、完整建模、允许长期重构
支撑域(Supporting) 为核心域服务,有一定业务规则但无差异化价值 简化建模,够用即可,可随核心域调整
通用域(Generic) 行业通用、市面有成熟方案(身份权限、组织、消息通知、审批引擎、报表) 外购或复用平台能力,不要自研

资源分配问题。团队习惯把同样的工程标准撒到所有模块上,结果是核心业务拿不到应有的设计投入,边缘功能却消耗了大量重构预算。子域划分的作用是把“哪里值得花钱”变成显式决策。

Evans 在《领域驱动设计》中把它作为战略设计的第一步:先分解问题空间并标注价值,再谈模型与边界。

单靠“这块业务很重要”无法判定核心域,用三个问句:

  1. 做差了对经营结果的影响是否可感知?(转化率、成本、合规风险、履约时效)
  2. 规则是否频繁变化,且变化本身来自业务策略?(如果三年不变,多半不是核心)
  3. 竞争对手是否难以复制这部分能力?(可复制的一律降级为支撑或通用)

三条中两条成立 → 核心域。只满足第 1 条且规则稳定 → 支撑域。三条都不满足 → 通用域。

辅助信号:缺陷集中在哪、需求变更集中在哪、业务专家的时间花在哪。核心域通常也是“业务方愿意来讨论规则细节”的地方。

维度 子域 限界上下文
空间 问题空间(业务是什么) 解空间(系统怎么组织)
归属 业务视角,与实现无关 架构视角,由建模决定
数量关系 一个核心子域可对应多个上下文(按团队与一致性需要细分) 一个上下文通常只服务一个子域

映射原则:核心子域要单独成上下文,避免它的模型被支撑域或通用域的概念污染;通用子域尽量以适配方式接入,不进入核心模型。

  • 能力地图标注:在业务能力清单上标核心/支撑/通用,并附投入策略与负责人,作为架构资产维护。
  • 差异化构建决策(Buy vs Build):通用域优先选用成熟组件(工作流引擎、权限中心、搜索服务、消息平台),把自研预算留给核心域。
  • 团队与代码结构对齐:核心域配稳定的长期团队;通用域可由平台团队维护,业务方只消费接口。
误区 后果
所有模块都按核心域标准建模 交付变慢、抽象层泛滥,团队对方法产生抵触
把“技术复杂”当成核心域 高并发、大数据量属于规模复杂度,不是业务差异化,投入方式完全不同
自研通用域(自己写审批引擎、权限系统) 长期维护成本吞噬核心域预算
核心域与支撑域共用一个模型 支撑域的变更频繁侵入核心域,规则被绑架
一年前标注的核心域不再复核 业务重心迁移后,投入错配
  • 限界上下文:子域指导上下文划分,上下文承载子域的模型。
  • 统一语言:核心域最值得投入术语治理。
  • 上下文映射:描述子域/上下文之间的协作与耦合方式。
  • Eric Evans《领域驱动设计》第 4 部分(战略设计)
  • Vaughn Vernon《实现领域驱动设计》第 10 章(上下文映射与子域分类)
  • Nick Tune 等《Learning Domain-Driven Design》(子域与架构组件映射的现代表述)