今天我想与你聊一聊,DDD概念复杂、难懂,实际落地该怎么设计代码实现模型。关于这个话题,先说说整体框架、思路,我打算结合两部分分享给你,每一部分,相信仔细看完,都会或多或少有所收获。以下内容,预计1分钟左右可快速看完:
前一部分,方法篇,旨在详细介绍DDD所包含的几个核心概念,以及围绕这些概念所构建的DDD代码实现模型的组成结构。
后半部分,实践篇,进一步思考。我继续接着说,承接前面的内容,要想让这些代码实现模型真正落地,我们需要把它们与具体的应用场景结合起来。我将侧重详细阐述DDD代码实现模型的设计方法,并给出一个具体的案例分析。
伴随着业务系统复杂度的不断提升,以及微服务架构等分布式技术体系的大行其道,领域驱动设计(Domain Driven Design,DDD),日渐成为系统建模领域的主流设计思想和模式。在DDD中,引入了限界上下文、聚合、实体、值对象、领域事件、资源库、应用服务等一系列核心概念。
通过这些概念,开发人员可以开展系统设计和实现工作。但是,DDD中的这些概念相对都比较抽象,甚至有些晦涩难懂。再往相通或类似问题点上靠,我认为实质上对于复杂难懂的概念的理解和把握,我们一开始不必过于纠结这些概念本身,而是可以把它们与现实中的具体实现模型对应起来。
通过两者之间的合理映射,来促进对概念本身的理解,如下图所示。这里多说一句,即便你是其他技术领域的朋友,或许也曾遇到过类似问题,并有着共通性。希望看完今天的分享,可以或多或少帮助到你,并有所启发、思考。
在上图中,我们一方面尝试把复杂概念映射到实现模型。另一方面,基于对实现模型的把握,可以反推对复杂概念的理解程度,从而更好地掌握这些概念。这也更足以见得实践才能出真知,也只有设计过实现模型,才能真正掌握这些概念,从而把它们应用到各种具体的场景中。
这是一种行之有效的办法。
那么问题就来了,在日常开发过程中,如何确保DDD真正落地,把这些抽象概念转为具体代码模式,是我们今天要讨论的内容。
01⎪
想设计代码实现模型,咱非得了解DDD中这几个核心概念?
总体来说,DDD提供的是一种开展业务建模和软件设计的方法论。DDD认为良好的系统架构,应该是技术架构和业务架构相互融合的结果,开发人员不能脱离业务领域来设计技术架构。为了实现这一目标,DDD提出了一组核心概念,如图1所示。
我们先来看第一个核心概念,就比较难于理解,即限界上下文(Boundary Context)。在DDD中,当我们把业务领域拆分成多个子域之后,限界上下文明确了子域的业务界限,并实现子域与子域之间的隔离,如图2所示。
有了限界上下文,我们就需要围绕业务场景设计领域模型对象(Domain Model Object)。领域模型对象,包含了丰富的业务逻辑和操作行为,这点和只包含数据属性的传统数据对象,有本质区别。
因此,领域模型对象是我们在应用DDD时,最应该关注的一组对象,也是最难把握的一组对象。
在DDD中,领域模型对象包括三大类,即聚合(Aggregate)、实体(Entity)和值对象(Value Object),这三类对象各有特点。
相较领域模型对象,领域事件诞生较晚,但也是领域模型的一个重要组成部分,因为现实中很多场景,都可以抽象成事件(Event),如图4。
在DDD中,通过领域事件可以实现业务状态变化的有效传播,并在单个限界上下文内部或在多个上下文之间,对这些状态变化做出响应。
业务领域中的各种状态变化最终都需要进行存储。为此,DDD提供了一个针对业务数据的统一访问入口,这就是资源库(Repository)。通过资源库,我们可以实现对各种领域对象的持久化操作,如图5所示。