领域驱动设计:必须要理解的子领域与界限上下文

引言

领域驱动设计要进行领域划分、界限上下文设计、上下文映射等宏观维度的设计,本文主要对子领域、界限上下文以及上下文映射进行介绍。

领域驱动设计:必须要理解的子领域与界限上下文

子领域:Sub-Domain

领域是软件应用所要解决的问题空间,如果能用一个统一的模型对领域进行表述看上去是合理,但往往是不现实的。最为突出的问题是同一个概念被不同的模型复用,在不同的系统区域会存在冲突和歧义,即同一概念在不同的上下文环境中可能会存在不同语义。就好比是同一个单词,在不同的语境下意思可能不同。这也是为什么领域驱动设计侧重于通过 “分而治之” 的原则应对领域复杂性的原因。

利用“分而治之”的思想,将大问题领域分解为子领域有助于管理领域复杂性,同时可以将系统的重要组成部分与其他剩余部分进行分离。领域驱动设计中将子领域划分为三类:

领域驱动设计:必须要理解的子领域与界限上下文

  • 核心领域:Core Domain

核心领域是系统需要最高优先级处理的领域,是系统最为重要的部分,它是系统是否成功的关键所在。

  • 通用领域:Generic Domain

贯穿整个领域系统,是业务系统的公用部分,通用领域不是核心领域,一般核心领域依赖通用领域。

  • 支撑领域:Supporting Domains

支撑领域是支撑着核心域的领域。

界限上下文:Bounded Contexts

一个界限上下文(Bounded Context, 后简称BC)区分、封装并定义了模型的具体职责,根据业务相关性、耦合的强弱程度、分离的关注点对这些活动进行归类,找到不同类别之间存在的边界,这就是限界上下文的含义。上下文(Context)是业务目标,限界(Bounded)则是保护和隔离上下文的边界,避免业务目标的不单一而带来的混乱与概念的不一致。每一个模型必须在一个子领域内显示定义的上下文中, 并且每个上下文都要具备边界,这种边界基于具体的技术实现,界限上下文对模型进行隔离,确保单个上下文内的模型不存在语言歧义,因为,BC首先应该是一种语言边界。

上下文间的关系: Context Mapping

除了技术细节需要考虑,还有另外一项非常重要的方面就是界限上下文之间的关系,而定义上下文映射(Context Map)就是为了解决领域上下文间的协作关系。领域驱动设计中定义上下文映射有不同的模式,比如共享内核模型、防腐层、共享主机等诸多模式,但需要说明的是,这些模式并不是具体的技术细节定义,而是表述上下文关系的一种模型,是对上下文关系的抽象表达

合作关系(Partnership)

合作模式表达了这样一种上下文关系:

如果两个限界上下文的团队要么一起成功,要么一起失败,此时他们需要建立起一种合作关系,他们需要一起协调开发计划和集成管理。两个团队应该在接口的演化上进行合作以同时满足两个系统的需求。应该为相互关联的软件功能制定好计划表,这样可以确保这些功能在同一个发布中完成。

从合作关系的表述中可以看出,这是一种强耦合的依赖关系

,两个上下文紧紧耦合在一起。强耦合必然导致系统的扩展性下降。

共享内核(Shared Kernel)

共享内核的剥离一般是从上游上下文中进行,原来处于上游BC中的部分被多个下游BC公用,由此抽离出公共的上下文。

领域驱动设计:必须要理解的子领域与界限上下文

共享内核的优点是

降低了上下游间的直接耦合,降低上下文间的依赖关系。

共享内核模式的缺点:多个上下文都直接依赖于共享内核,这种多端依赖导致对共享内核的变更灵活性下降,可谓是“牵一发而动全身”。每次修改,都需要对多端进行影响分析,并协调各个团队对变更达成一致,由此必然会导致业务复杂度、技术复杂度和沟通成本的上升。

客户方-供应方开发(Customer-Supplier Development)

正常情况下,这是团队合作中最为常见的合作模式,体现的是上游(供应方)与下游(客户方)的合作关系。上下游团队对:下游提出的领域需求、通信协议、上游对协议或调用方式的变更等诸多方面进行协商。

供应方可能存在多个客户方,因此,供应方提供服务时需要考虑服务的一致性、通用性和差异性,变更时需要注意及时与客户方协商并达成一致。

遵奉者(Conformist)

Customer-Supplier模式是上游满足下游的需求,而遵奉者模式是下游BC对上游BC提供的能力进行适配。这种适配不仅仅是表现在对上游服务能力追随,还有就是对上游BC模型的遵循。

分离方式(Separate Ways)

分离表述的是这样一种关系模式:两个上下文间是独立的、分离的,二者之间没有集成或依赖。分离关系是最为理想的关系,将上下文间的耦合降到了最低。处于分离关系的上下文可以独立演进而不影响。

防腐层(Anticorruption Layer)

不论是遵奉者模式还是客户-供应方模式,上下文间都存在耦合,下游BC要依赖于上游BC。为了尽量降低下游对上游BC的直接依赖,在下游BC中一如一层防腐层,将下游与上游的耦合转移到防腐层中。这种简介层的引入,有助于隔离上游BC出现不可控变化时对下游BC造成的影响。如下图所示,在下游BC引入防腐层:

领域驱动设计:必须要理解的子领域与界限上下文

开放主机服务(Open Host Service)

与防腐层模式相比,开放主机服务模式是在上游BC进行操作的一种隔离方式。开放主机服务一般与“Published Language”模式结合,定义公开的标准协议、通信方式等供下游调用者使用。同样,开放主机服务模式也能有效降低了上下游间的依赖,有助于帮助上游BC对下游BC进行隔离。


分享到:


相關文章: