一、简介
在上一篇里提到限界上下文这个概念:https://www.cnblogs.com/lay2017/p/10448028.html
它将领域模型待解决的问题框定了一个范围,也将领域模型和系统以及限界上下文粗粒度的归为了同一个范畴的东西。
那么我们思考一个问题,在我们开发多个系统的时候是不是需要去考虑一下系统之间的关系,他们是如何相互依赖的?
在DDD中,也即是我们是不是需要去思考一下限界上下文之间的关系呢?
这个即“上下文映射图”所要做的事,它用来表示不同的限界上下文之间的集成关系。思考限界上下文之间的关系也是战略设计的一部分
二、集成关系
本文关注以下三个限界上下文之间的集成关系
1、防腐层
防腐层这个词听起来有点别扭,我们想想23种设计模式中的适配器模式、门面模式,是不是比较容易理解了。
这两种模式都是将独立的程序进行了包装,把使用方和实现方隔离开了,如果实现方出现修改不影响使用方,最多就是修改门面内部调用或者增加适配器之类的。
DDD中,防腐层也是同样的理念,设立防腐层就是为了进行隔离,其实和面向接口编程也是同样的意思。
所以,要在DDD中引入防腐层,你可以专门建立门面类、适配器类、或者一些独立的接口类。
2、开放主机服务
开放主机服务,听起来更别扭。我们想想做springmvc开发Http接口调用服务端的程序并返回结果这个过程,是不是等同于服务端开放了服务呢,而开放的方式就是通过HTTP协议的rest接口。
这样类比一下就比较清晰了,在DDD中,开放主机服务意味着你需要定义一种统一的协议,比如HTTP,来暴露你要开放的服务。而其它人统一根据你定义的协议来消费你的服务。
或者你再类比一下微服务的RPC协议进行远程调用,应该就能理解什么是开放主机服务。
3、发布语言
在理解什么是发布语言之前我们先思考一个问题,一个讲法语的人和一个讲中文的人怎么沟通呢?
显然这是一个问题,但如果他们同时又会一门第二语言比如英文,那么他们则完成可以用英文进行沟通。而他们仍然和讲法语的说法语,讲中文的说中文。
这听起来是不是像是“翻译”的概念?是的,发布语言也即是限界上下文之间的翻译
限界上下文中的模型是不一样的,构建的对象也不一样。比如用户系统的“用户”和消息系统的“发送者”,他们有相同的也有不同的。当我们再消息系统中需要构建一个“发送者”的时候,可能需要获取到“用户”这个对象。比如我们通过RPC调用返回了一个JSON结构的“用户”数据,我们再将JSON数据解析,生成一个“发送者”这个对象。在这里“JSON”这个语言就成了发布语言,它表示两个限界上下文之间的公用语言,类比一开始我们说的“英语”
除了JSON之外,我们常用的还有XML格式等。或者如果在同一个内存当中,我们甚至可以直接做对象实例化转换,比如单独写一个Translator类来专门处理这样的事。