【架构设计 领域驱动开发 三】战略建模

上一篇学习了基本概念,对DDD有了一个整体的把控,那么,这一篇就是对战略建模进行介绍了,首先什么是战略,战略,是一种从全局考虑谋划实现全局目标的规划,战术只为实现战略的手段之一。实现战略胜利,往往有时候要牺牲部分利益,去获得战略胜利。战略是一种长远的规划,是远大的目标,往往规划战略、制定战略、用于实现战略的目标的时间是比较长的。争一时之长短,用战术就可以达到!如果是“争一世之雌雄”,就需要从全局出发去规划,这就是战略!以上内容来自百度。总而言之,战略是大框架,大方向,如果架子搭错了,方向走错了,战术再犀利,也没有什么作用。那么对于DDD来说,战略的实现主要有以下两个方面:1,限界上下文,2,上下文映射

图片来自https://www.cnblogs.com/Leo_wl/p/4343177.html

定义

它是一个限定边界的环境,在该环境中,每一个模型的概念(包括它的属性和操作)都具有特殊的含义。它是战略建模的核心。 换句话说,在每一个限界上下文里都共用且只有一套通用语言,不存在二义性。

概念解析

学习自《实现领域驱动设计》

与子域最好一对一

一般一个限界上下文对应一个子域。另外一个限界上下文有可能包含的不只一个子域。

分阶段创建上下文

不仅限于包含模型

限界上下文不仅仅只包含模型。虽然领域模型是限界上下文的主要“公民”。但是限界上下文并不只局限于容纳模型,它通常标定一个系统、一个应该程序或一种业务服务(表示一系统用于实现业务用例的复杂组件)。有时,限界上下文所包含的内容可能比较少,比如,一个通用子域便可以只包含领域模型。举例来说, 当模型驱动着数据库Schema时,此时的Schema也应该位于该模型所处的上下文边界之内。换言之,数据库中表和列名字应该和模型的名字保持一致。模型应该用来驱动数据库和用户界面的设计,而不是反向驱动。

不要随意拆分上下文

不要为了分配任务而拆分限界上下文。我们没有必要为了管理技术资源而创建一些假的上下文边界。

使用语言驱动

采用语言驱动来实施DDD,这里底线:如果没有采用语言驱动,那么你就不算在和领域专家一起工作来创建限界上下文。

认真设计大小,不要急于小型化

认真考虑限界上下文的大小,不要急于将其小型化。

与技术组件保持一致

与技术组件保持一致。技术组件并不能定义限界上下文。一个限界上下文通常就一个工程项目。VS中在同一个解决方案中将用户界面、应用服务和领域对象分离在不同的子项目中是合理的。项目源代码可以只包含领域模型,也可以包含一些周边的层或六边形区域。

上下文映射图(Context Mapping)

基本概念

上下文映射图(Context Map):可以进行拆分理解,上下文指的就是限界上下文,映射的意思就是关联、联系,就像 ORM 中,对象与关系的映射,图就是把限界上下文之间的关联与联系表现出来,具体的展示就是类似上面的图。

上游与下游的概念,上游是服务提供者,下游是服务接收者

其中ACL表示防腐层,OHS表示开放主机服务,PL表示 发布语言。

绘制上下文映射图

初步绘制

明确需要创作协作上下文,同时需要创建第二个限界上下文,但不知道如何将此上下文从核心域分离

分离内核

由于角色的分离,有必要进行内核的分离

上图可以看出,核心的敏捷项目管理位于下游,也就是表示核心模型位于其他系统的下游,上游模型会对下游模型产生影响,不论是积极的还是消极的。

技术要点

开放主机服务

该模式可以通过REST来实现,通常来讲,可以将开放主机服务看成是远程过程调用API,同时,它也可以通过消息机制实现。

发布语言

实现方式有多种,发布语言可以有多种实现方式,最常用的就是XML和Schema

1,在使用REST服务时,发布语言用来表示领域概念,此时可以使用XML和JSON。

2,如果你打算发布web界面,也可以使用HTML。

3,同时发布语言还可以用于事件驱动框架,领域事件以消息的形式发送给订阅方

防腐层

在下游上下文中,我们可以为每个防腐层定义相应的领域服务。同时你可以将防腐层用于资源库接口。

1,在使用REST时,客户端的领域服务将访问远程的开放主机服务

2,远程服务器以发布语言的形式返回

3,下游的防腐层将返回的内容翻译成本地上下文的领域对象。

比如,协作上下文向身份与访问上下文请求“具有Moderator角色的用户”。所返回的数据可能是XML格式或者JSON格式,然后防腐层将这些数据翻译成协作上下文中的Moderator对象,该对象是一个值对象。之歌Moderator实例反映的是下游模型中的概念,而不是上游模型。

如何自治

非自治

接上边的例子,协作上下文向身份与访问上下文请求“具有Moderator角色的用户”。

在该种自治机制下:

1, MemberService是一个领域服务,它向本地模型提供ProductOwner和TeamOwner对象,同时作为防腐层的接口

2,mantainService()方法用于周期性的检查身份与访问上下文所发出的通知。该方法不由模型的正常客户调用,而是由通知组件周期性调用。如下图的MemberSynchronizer表示这样的通知组件,他会把请求委派给MemberService.

3,MemberService.会进一步把请求委派给IdentityAccesssNotificationAdapter,该类在领域服务和远程的开发逐句服务之间扮演适配器的角色,该适配器作为远程系统的客户端而存在

4,一旦适配器从远程开放逐句服务获得了数据,它将调用MemberTranslator的toMember()方法将发布语言中的媒体数据翻译成本地系统的领域对象Member.如果该对象已存在,则更新之。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年1月1日
下一篇 2018年1月1日

相关推荐