多个上下文之间如何协作
上下文映射(Context Mapping)
- 上下文映射 是指限界上下文之间的模型映射关系
- 描述团队之间的协作关系以及上下文之间的集成关系
- 决定上下文之间如何集成以及如何设置防腐层
所谓的依赖不仅仅指调用关系,调用关系只是其中的一个方面,更重要的是模型与模型之间的映射关系。
不同限界上下文各自包含了一些关键概念,其中有一些重叠的概念,比如交易上下文和支付上下文都包含了支付二维码这个概念,交易上下文和设备上下文都包含了商品概念,这种现象是正常的,这就是限界上下文的意义所在。
但是在系统实现的过程中,我们需要处理一个问题,当集成两个概念重叠的限界上下文的时候,怎样处理这种重叠,是将其中一个转换成另一个或者多个,还是一个向另一个看齐。
这就是模型与模型之间的映射关系,这和团队之间的协作关系,以及上下文之间的集成关系是等价的。
当你要集成另一个上下文的时候,就意味着要看到它暴露出来的一些概念,比如说要集成一个商品中台,就要了解它传递过来的一些商品字段是什么意思,如果内部也有商品这个类,就需要把它提供的商品对象转换成内部可以用的商品对象,这就是一种比较常见的映射关系 ,这个时候就称商品中台上下文是上游
上下文映射模式
开放主机服务
现在开发系统,很多时候会借助一些第三方服务,包括云厂商的服务,或者内部中台,或者架构部门提供的成熟组件,这种服务和组件很多时候以公共 API 的方式暴露出来,这种以公共API 的方式提供的服务就叫做开放主机服务。
- 服务提供方文所有消费方提供一套公共的 API
- 针对通用的功能和模型
服务提供方为所有的服务消费方都提供一套统一的 API,不搞特殊化。
比如支付上下文就集成了 微信支付上下文,微信支付提供服务的方式就是开放主机服务。
可以用简写的 U 和 D 来表示这种上下游的关系。
在开放主机服务模式中,还隐藏了一种模式,因为开放主机服务的 API 很难为下游的某个上下文进行定制,所以下游的上下文就只能遵从它提供的模式,这个时候我们就称呼下游为 顺存者
顺从者
-
没有模型到模型的转换
-
一个上下文直接引用另一个上下文的部分模型
顺从者模式隐藏着一个风险,当你顺从一个上下文的时候,其实就是允许了它对你的侵入,如果我们除了对接微信支付,还需要对接支付宝等支付平台,就意味着需要引入多个上下文,这个时候如果不采用特殊方法,上下文就会变得比较混乱且难以维护。
大泥球
在 DDD 中,这种比较混乱的模型就叫做大泥球。
- 由混杂的模型构成的糟糕系统,模型不稳定且难以维护。这是一种反模式,我们要避免发生。
- 与大泥球合作的上下文要确保自身不被污染,设置防腐层。比如集成旧系统,比如对旧系统进行重构的时候。
为了避免大泥球出现,就需要利用到另外一种很常见的模式 防腐层
防腐层
所谓防腐层,作用就是
- 把上游上下文的模型转换成自己上下文的模型
- 是由下游上下文实现的访问外部模型的一个代理层