目录
前言
核心概念
限界上下文
通用语言
子域
如何落地DDD
上下文映射
实体和值对象
聚合
领域事件
小结
前言
DDD是反对贫血模型的,所以最后需要在实体里加入复杂的行为方法
我们可以认为 DDD是把service和domain结合在一起,变成了DDD的Entity
核心概念
限界上下文
就是给每个系统划分一个边界,把每个系统拆分出来,他们都有自己的领域和领地,并不是混合在一起的,一个限界上下文可以对应我们一个大系统(电商系统、广告系统)里的一个子系统(订单系统,是几个人负责维护,他们共享一个订单系统这么一个限界上下文)
订单系统就有几十个人负责维护,生单系统(5个人负责维护)、价格系统(5个人)、拆单系统(5个人),对于一个完整的系统,可以在里面先划分出来多个限界上下文,每个限界上下文可以对应一个子系统,独立的小团队专门负责维护这个子系统以及对应的限界上下文
其实就应该是你们公司里的一个较为核心的系统,有独立的代码仓库,有一个独立的团队负责维护一个系统,就是工作在这个限界上下文里,然后在这个限界上下文里需要对各种核心概念定义一套通用的中文和英文的名词和解释,这就是通用语言,团队每个人对这些中文和英文名词的含义都有共识
一个团队可以同时负责维护多个系统,也就是多个限界上下文,但是多个团队不能在一个限界上下文里工作,也就是多个团队同时修改一个系统的代码,那是不可能的,一个限界上下文就是一个独立的完整的系统,有独立的代码仓库、数据库、测试代码,独立团队,独立通用语言
通用语言
在不同的系统对应的限界上下文里,定义出来一批名词(一堆类),代表了这个限界上文里的通用语言,只有这个限界上下文里的几个系统的开发工程师,会按照同样的一批通用语言来理解所有的名词,大家对Customer这个名词的理解是一样
子域
子域有几种类型,一个是核心域,就是你的大系统里的最最重要的几个子系统,通常我们认为是支撑你公司核心业务运转的那些系统就是不同的核心域,分配的是公司最多的研发资源,投入最大;
一个限界上下文,也就是一个系统,是你的公司里极为核心的一个系统,就是一个核心系统,举个例子,一个电商平台里,商品、订单、库存、营销、仓储、物流、会员,每个大系统都可以是一个限界上下文,都是独立团队维护,都有自己内部的通用语言,然后他们都是公司最为核心的一些系统,所以这些限界上下文也可以叫做核心域
但是如果是一些非核心系统,比如说什么竞对数据爬虫系统、第三方比价系统、BI报表系统,类似这些,如果不支撑公司核心流程运转,主要是锦上添花的系统,那么他就不算是核心域
一个是支撑子域,这个说白了就是公司里的一些锦上添花的辅助系统,非核心系统,比如说什么爬虫系统、BI系统、竞对分析系统、社会化治理系统,这些系统可能会跟你的核心系统有交互,但是主要是辅助用的,甚至可能找外包来做,分配资源较少
最后一个是通用子域,类似什么HR系统、OA系统、CRM系统、权限系统、认证系统之类的,都有通用解决方案,可以直接找第三方厂商进行采购,然后进行集成,当然也可能是找外包做,或者内部做,但是投入的资源会很少很少
DDD是反对贫血模型的,所以最后需要在实体里加入复杂的行为方法
我们可以认为 DDD是把service和domain结合在一起,变成了DDD的Entity
限界上下文
就是给每个系统划分一个边界,把每个系统拆分出来,他们都有自己的领域和领地,并不是混合在一起的,一个限界上下文可以对应我们一个大系统(电商系统、广告系统)里的一个子系统(订单系统,是几个人负责维护,他们共享一个订单系统这么一个限界上下文)
订单系统就有几十个人负责维护,生单系统(5个人负责维护)、价格系统(5个人)、拆单系统(5个人),对于一个完整的系统,可以在里面先划分出来多个限界上下文,每个限界上下文可以对应一个子系统,独立的小团队专门负责维护这个子系统以及对应的限界上下文
其实就应该是你们公司里的一个较为核心的系统,有独立的代码仓库,有一个独立的团队负责维护一个系统,就是工作在这个限界上下文里,然后在这个限界上下文里需要对各种核心概念定义一套通用的中文和英文的名词和解释,这就是通用语言,团队每个人对这些中文和英文名词的含义都有共识
一个团队可以同时负责维护多个系统,也就是多个限界上下文,但是多个团队不能在一个限界上下文里工作,也就是多个团队同时修改一个系统的代码,那是不可能的,一个限界上下文就是一个独立的完整的系统,有独立的代码仓库、数据库、测试代码,独立团队,独立通用语言
通用语言
在不同的系统对应的限界上下文里,定义出来一批名词(一堆类),代表了这个限界上文里的通用语言,只有这个限界上下文里的几个系统的开发工程师,会按照同样的一批通用语言来理解所有的名词,大家对Customer这个名词的理解是一样
子域
子域有几种类型,一个是核心域,就是你的大系统里的最最重要的几个子系统,通常我们认为是支撑你公司核心业务运转的那些系统就是不同的核心域,分配的是公司最多的研发资源,投入最大;
一个限界上下文,也就是一个系统,是你的公司里极为核心的一个系统,就是一个核心系统,举个例子,一个电商平台里,商品、订单、库存、营销、仓储、物流、会员,每个大系统都可以是一个限界上下文,都是独立团队维护,都有自己内部的通用语言,然后他们都是公司最为核心的一些系统,所以这些限界上下文也可以叫做核心域
但是如果是一些非核心系统,比如说什么竞对数据爬虫系统、第三方比价系统、BI报表系统,类似这些,如果不支撑公司核心流程运转,主要是锦上添花的系统,那么他就不算是核心域
一个是支撑子域,这个说白了就是公司里的一些锦上添花的辅助系统,非核心系统,比如说什么爬虫系统、BI系统、竞对分析系统、社会化治理系统,这些系统可能会跟你的核心系统有交互,但是主要是辅助用的,甚至可能找外包来做,分配资源较少
最后一个是通用子域,类似什么HR系统、OA系统、CRM系统、权限系统、认证系统之类的,都有通用解决方案,可以直接找第三方厂商进行采购,然后进行集成,当然也可能是找外包做,或者内部做,但是投入的资源会很少很少
就是给每个系统划分一个边界,把每个系统拆分出来,他们都有自己的领域和领地,并不是混合在一起的,一个限界上下文可以对应我们一个大系统(电商系统、广告系统)里的一个子系统(订单系统,是几个人负责维护,他们共享一个订单系统这么一个限界上下文)
订单系统就有几十个人负责维护,生单系统(5个人负责维护)、价格系统(5个人)、拆单系统(5个人),对于一个完整的系统,可以在里面先划分出来多个限界上下文,每个限界上下文可以对应一个子系统,独立的小团队专门负责维护这个子系统以及对应的限界上下文
其实就应该是你们公司里的一个较为核心的系统,有独立的代码仓库,有一个独立的团队负责维护一个系统,就是工作在这个限界上下文里,然后在这个限界上下文里需要对各种核心概念定义一套通用的中文和英文的名词和解释,这就是通用语言,团队每个人对这些中文和英文名词的含义都有共识
一个团队可以同时负责维护多个系统,也就是多个限界上下文,但是多个团队不能在一个限界上下文里工作,也就是多个团队同时修改一个系统的代码,那是不可能的,一个限界上下文就是一个独立的完整的系统,有独立的代码仓库、数据库、测试代码,独立团队,独立通用语言
在不同的系统对应的限界上下文里,定义出来一批名词(一堆类),代表了这个限界上文里的通用语言,只有这个限界上下文里的几个系统的开发工程师,会按照同样的一批通用语言来理解所有的名词,大家对Customer这个名词的理解是一样
子域
子域有几种类型,一个是核心域,就是你的大系统里的最最重要的几个子系统,通常我们认为是支撑你公司核心业务运转的那些系统就是不同的核心域,分配的是公司最多的研发资源,投入最大;
一个限界上下文,也就是一个系统,是你的公司里极为核心的一个系统,就是一个核心系统,举个例子,一个电商平台里,商品、订单、库存、营销、仓储、物流、会员,每个大系统都可以是一个限界上下文,都是独立团队维护,都有自己内部的通用语言,然后他们都是公司最为核心的一些系统,所以这些限界上下文也可以叫做核心域
但是如果是一些非核心系统,比如说什么竞对数据爬虫系统、第三方比价系统、BI报表系统,类似这些,如果不支撑公司核心流程运转,主要是锦上添花的系统,那么他就不算是核心域
一个是支撑子域,这个说白了就是公司里的一些锦上添花的辅助系统,非核心系统,比如说什么爬虫系统、BI系统、竞对分析系统、社会化治理系统,这些系统可能会跟你的核心系统有交互,但是主要是辅助用的,甚至可能找外包来做,分配资源较少
最后一个是通用子域,类似什么HR系统、OA系统、CRM系统、权限系统、认证系统之类的,都有通用解决方案,可以直接找第三方厂商进行采购,然后进行集成,当然也可能是找外包做,或者内部做,但是投入的资源会很少很少
子域有几种类型,一个是核心域,就是你的大系统里的最最重要的几个子系统,通常我们认为是支撑你公司核心业务运转的那些系统就是不同的核心域,分配的是公司最多的研发资源,投入最大;
一个限界上下文,也就是一个系统,是你的公司里极为核心的一个系统,就是一个核心系统,举个例子,一个电商平台里,商品、订单、库存、营销、仓储、物流、会员,每个大系统都可以是一个限界上下文,都是独立团队维护,都有自己内部的通用语言,然后他们都是公司最为核心的一些系统,所以这些限界上下文也可以叫做核心域
但是如果是一些非核心系统,比如说什么竞对数据爬虫系统、第三方比价系统、BI报表系统,类似这些,如果不支撑公司核心流程运转,主要是锦上添花的系统,那么他就不算是核心域
一个是支撑子域,这个说白了就是公司里的一些锦上添花的辅助系统,非核心系统,比如说什么爬虫系统、BI系统、竞对分析系统、社会化治理系统,这些系统可能会跟你的核心系统有交互,但是主要是辅助用的,甚至可能找外包来做,分配资源较少
最后一个是通用子域,类似什么HR系统、OA系统、CRM系统、权限系统、认证系统之类的,都有通用解决方案,可以直接找第三方厂商进行采购,然后进行集成,当然也可能是找外包做,或者内部做,但是投入的资源会很少很少
如何落地DDD
DDD,拆分一些子域(拆分子系统)
如果我们要用DDD去建模一个新系统,其实就很明确了,
从业务角度出发,划分出多个子域(其实就是多个限界上下文),
然后标记出来哪些是核心域(核心系统),哪些是支撑子域(非核心系统),哪些是通用子域(通用系统,权限、认证之类的),
然后定义子系统集成方式,定义好系统之间的交互流程、核心链路、事件链路
然后进行核心类建模,定义消息和事件模型
划分团队去负责维护和开发
上下文映射
上下文映射,听着特别牛,其实就是说子域如何进行集成,也就是各个系统如何通过接口进行集成,你需要把别的系统的一些通用语言里的东西在接口里转换/映射为你的系统里的通用语言,如果是在一个系统里划分多个子域的,那么就是一个系统内部的各个模块间如何通过interface进行集成,不同模块的类如何进行映射和转换
上下文映射类型:
合作关系:一根粗线条连接两个限界上下文,这个意思是说需要有一个中间翻译的过程,对不同系统的类进行转换
共享内核:两个限界上下文有一个交集,交集用阴影表示,意思是两个团队维护一个共享的小模型,里面的类是大家都认可的,一般小模型让其中一个团队来维护,这个其实很常见的,就是一般哪个系统暴露接口出去,就自己把接口和实体类都定义在一个独立的工程里,然后别的团队就理解这个小模型就行了
客户端-供应商,也就是U-D,跟随者,跟随者有点类似于什么呢,比如说你的系统要跟第三方的系统进行集成,那么此时你就必须要当跟随者,去理解第三方系统的模型,按照他的模型去开发
防腐层:这个就是说,你可以在跟其他系统集成的时候开发一个防腐层,比如说你在调用其他系统的时候,建立一个防腐层接口,这个防腐层接口对你内部是几乎不变化的,这样你内部代码几乎不用变,但是如果外部接口变化了,那么你可以在防腐层里做一些转换,隔离这个变化
开放主机服务:就是类似于开放平台API
已发布语言:就是说系统集成用什么xml、json之类的通用数据格式,或者是用类似于thrift这种方式,定义一份通用接口,然后生成不同语言的代码
各行其道:上下文之间没有关系;大泥球,很混乱组织在一起
实体和值对象
实体和值对象,说白了就是去建模你每个子域里的具体类
聚合
聚合,就是如何把实体和值对象聚合成一个关系;
一个聚合,应该是在一个事务里一起更新,必须要保证这个事务更新了这个聚合的整体或者部分的时候,必须保证聚合里的各个实体的数据是一致的。提交订单肯定是一个事务,操作一些实体,Order、OrderItem,插入订单、插入订单条目,订单和订单条目是不是必须是一致的
符合事务原则的相关联的实体,就可以设计成一个聚合,让他们在DDD里有一个聚合的关系
领域事件
领域事件,其实有点类似于系统间进行交互时候的一些核心事件,类似什么创建订单之类的
【战略设计,战术设计】
战略设计:就是限界上下文的划分,子域、核心域、支撑子域、通用子域的定义,上下文映射进行子域集成,在软件设计中,这本质就是一个概要设计,架构师做概要设计,整体设计好,交付各个团队/个人去做详细设计
战术设计:就是详细设计的一部分,每个团队/个人拿到自己负责的子域,在里面需要设计通用语言,也就是说,需要通过聚合、实体、值对象、领域事件这些概念,去设计对应的各个类以及核心方法,完事儿了以后还得去设计对应的数据库表结构,正式接口定义,子系统具体业务流程,时序图之类的东西
小结
其实DDD没有多么神, 三层架构也没有这么low,各有优缺点, DDD只是代表了一种设计方式,或许很多年以后DDD就会像现在的三层设计一样, 那时候都在用DDD做系统设计
DDD,拆分一些子域(拆分子系统)
如果我们要用DDD去建模一个新系统,其实就很明确了,
从业务角度出发,划分出多个子域(其实就是多个限界上下文),
然后标记出来哪些是核心域(核心系统),哪些是支撑子域(非核心系统),哪些是通用子域(通用系统,权限、认证之类的),
然后定义子系统集成方式,定义好系统之间的交互流程、核心链路、事件链路
然后进行核心类建模,定义消息和事件模型
划分团队去负责维护和开发
上下文映射
上下文映射,听着特别牛,其实就是说子域如何进行集成,也就是各个系统如何通过接口进行集成,你需要把别的系统的一些通用语言里的东西在接口里转换/映射为你的系统里的通用语言,如果是在一个系统里划分多个子域的,那么就是一个系统内部的各个模块间如何通过interface进行集成,不同模块的类如何进行映射和转换上下文映射类型:
合作关系:一根粗线条连接两个限界上下文,这个意思是说需要有一个中间翻译的过程,对不同系统的类进行转换
共享内核:两个限界上下文有一个交集,交集用阴影表示,意思是两个团队维护一个共享的小模型,里面的类是大家都认可的,一般小模型让其中一个团队来维护,这个其实很常见的,就是一般哪个系统暴露接口出去,就自己把接口和实体类都定义在一个独立的工程里,然后别的团队就理解这个小模型就行了
客户端-供应商,也就是U-D,跟随者,跟随者有点类似于什么呢,比如说你的系统要跟第三方的系统进行集成,那么此时你就必须要当跟随者,去理解第三方系统的模型,按照他的模型去开发
防腐层:这个就是说,你可以在跟其他系统集成的时候开发一个防腐层,比如说你在调用其他系统的时候,建立一个防腐层接口,这个防腐层接口对你内部是几乎不变化的,这样你内部代码几乎不用变,但是如果外部接口变化了,那么你可以在防腐层里做一些转换,隔离这个变化
开放主机服务:就是类似于开放平台API
已发布语言:就是说系统集成用什么xml、json之类的通用数据格式,或者是用类似于thrift这种方式,定义一份通用接口,然后生成不同语言的代码
各行其道:上下文之间没有关系;大泥球,很混乱组织在一起
实体和值对象
实体和值对象,说白了就是去建模你每个子域里的具体类
聚合
聚合,就是如何把实体和值对象聚合成一个关系;
一个聚合,应该是在一个事务里一起更新,必须要保证这个事务更新了这个聚合的整体或者部分的时候,必须保证聚合里的各个实体的数据是一致的。提交订单肯定是一个事务,操作一些实体,Order、OrderItem,插入订单、插入订单条目,订单和订单条目是不是必须是一致的
符合事务原则的相关联的实体,就可以设计成一个聚合,让他们在DDD里有一个聚合的关系
领域事件
领域事件,其实有点类似于系统间进行交互时候的一些核心事件,类似什么创建订单之类的
【战略设计,战术设计】
战略设计:就是限界上下文的划分,子域、核心域、支撑子域、通用子域的定义,上下文映射进行子域集成,在软件设计中,这本质就是一个概要设计,架构师做概要设计,整体设计好,交付各个团队/个人去做详细设计
战术设计:就是详细设计的一部分,每个团队/个人拿到自己负责的子域,在里面需要设计通用语言,也就是说,需要通过聚合、实体、值对象、领域事件这些概念,去设计对应的各个类以及核心方法,完事儿了以后还得去设计对应的数据库表结构,正式接口定义,子系统具体业务流程,时序图之类的东西
小结
其实DDD没有多么神, 三层架构也没有这么low,各有优缺点, DDD只是代表了一种设计方式,或许很多年以后DDD就会像现在的三层设计一样, 那时候都在用DDD做系统设计
实体和值对象,说白了就是去建模你每个子域里的具体类
聚合,就是如何把实体和值对象聚合成一个关系;
一个聚合,应该是在一个事务里一起更新,必须要保证这个事务更新了这个聚合的整体或者部分的时候,必须保证聚合里的各个实体的数据是一致的。提交订单肯定是一个事务,操作一些实体,Order、OrderItem,插入订单、插入订单条目,订单和订单条目是不是必须是一致的
符合事务原则的相关联的实体,就可以设计成一个聚合,让他们在DDD里有一个聚合的关系
领域事件
领域事件,其实有点类似于系统间进行交互时候的一些核心事件,类似什么创建订单之类的
【战略设计,战术设计】
战略设计:就是限界上下文的划分,子域、核心域、支撑子域、通用子域的定义,上下文映射进行子域集成,在软件设计中,这本质就是一个概要设计,架构师做概要设计,整体设计好,交付各个团队/个人去做详细设计
战术设计:就是详细设计的一部分,每个团队/个人拿到自己负责的子域,在里面需要设计通用语言,也就是说,需要通过聚合、实体、值对象、领域事件这些概念,去设计对应的各个类以及核心方法,完事儿了以后还得去设计对应的数据库表结构,正式接口定义,子系统具体业务流程,时序图之类的东西
小结
其实DDD没有多么神, 三层架构也没有这么low,各有优缺点, DDD只是代表了一种设计方式,或许很多年以后DDD就会像现在的三层设计一样, 那时候都在用DDD做系统设计
领域事件,其实有点类似于系统间进行交互时候的一些核心事件,类似什么创建订单之类的
【战略设计,战术设计】
战略设计:就是限界上下文的划分,子域、核心域、支撑子域、通用子域的定义,上下文映射进行子域集成,在软件设计中,这本质就是一个概要设计,架构师做概要设计,整体设计好,交付各个团队/个人去做详细设计
战术设计:就是详细设计的一部分,每个团队/个人拿到自己负责的子域,在里面需要设计通用语言,也就是说,需要通过聚合、实体、值对象、领域事件这些概念,去设计对应的各个类以及核心方法,完事儿了以后还得去设计对应的数据库表结构,正式接口定义,子系统具体业务流程,时序图之类的东西
其实DDD没有多么神, 三层架构也没有这么low,各有优缺点, DDD只是代表了一种设计方式,或许很多年以后DDD就会像现在的三层设计一样, 那时候都在用DDD做系统设计



