DDD概念求教:领域模型属于领域还是子领域?附电商示例
DDD核心概念边界澄清
先纠正最根本的认知偏差
Domain(领域) 是纯业务维度的概念,指的是一套系统要覆盖的所有业务问题、业务知识、业务活动的范围边界,和代码实现没有直接绑定——绝对不是你代码里写的某个实体类或者某个包。
举个最直白的例子:你做一套电商系统,整个「线上零售卖货」的全链路业务知识范围,就是这套系统对应的顶层领域。
Sub-domain(子领域)到底是什么
子领域是对顶层大领域的业务维度拆分,相当于把一整块复杂的业务,按职责边界拆成一个个独立的、聚焦解决某一类特定业务问题的小块,拆分全程不需要考虑代码怎么写,只看业务逻辑是不是归属于同一个问题域。
行业里通常把子领域按业务价值分成三类:
- 核心子领域:决定你业务核心竞争力的部分,是别人抄不走的核心规则,比如电商的差异化定价、专属优惠规则、履约时效算法
- 支撑子领域:业务跑起来必须有,但不产生核心竞争力的部分,比如电商的用户收货地址管理、客服工单流转
- 通用子领域:全行业都能用的通用能力,没有业务差异化,比如登录鉴权、支付通道对接、文件存储
你的代码示例错在哪
你写的这段代码:
// My understanding is, this class is a domain. // So domain model is actually a domain living inside of e-commerce bounded context. package io.joseph.e-commerce.domain; class ShoppingCart { private String shoppingCartId; }
这里的认知偏差非常典型:
ShoppingCart类既不是领域,也不是子领域。它是*领域模型(Domain Model)*的一个组成元素——领域模型是你把领域里的业务规则、业务实体抽象之后落地的代码表达,是用来承载领域逻辑的载体,本身不等于领域。
你注释里提到的限界上下文(Bounded Context)是代码实现维度的边界,和业务维度的子领域不是一个层面的概念:通常一个子领域会对应一个限界上下文,复杂度高的核心子领域可能拆成多个限界上下文,简单的支撑/通用子领域也可能合并到同一个限界上下文里实现。
电商场景实际划分参考(纯业务视角,和代码包无关)
电商顶层领域(线上零售业务)的常见子领域划分:
- 核心子领域:
- 商品子领域:负责SPU/SKU管理、商品属性、定价规则
- 交易子领域:负责购物车逻辑、订单生成、优惠计算、订单状态流转
- 履约子领域:负责库存扣减、物流调度、售后退换货处理
- 支撑子领域:
- 用户子领域:负责账号信息、收货地址、会员等级管理
- 客服子领域:负责咨询接待、工单流转、投诉处理
- 通用子领域:
- 认证鉴权子领域:负责登录、权限校验
- 支付子领域:负责对接第三方支付渠道、资金流水记账
你代码里的ShoppingCart,就属于「交易子领域」对应的限界上下文里,领域模型的一个实体类而已。
内容的提问来源于stack exchange,提问作者Joseph Yohan
相关产品推荐
相关产品推荐

