实现领域驱动设计-应用程序

应用程序定义

“应用程序”表示那些支撑核心域模型的组件,通常包括领域模型本身,用户界面,内部使用的应用服务和基础设施组件等

这是书中的定义,理解起来跟通常意义的“应用程序”也是一样的,就是一个可以用的软件,就是完成一定业务功能的完整的程序,就是把领域模型、领域服务、应用服务、资源库、基础设施加上用户界面组合起来,构成一个整体。形式可以有很多种,可以是桌面应用程序或web应用程序乃至移动端App。当然使用bash编写一个脚本,实现一定功能,其实也算是一个应用程序,只是一般太简单了,不属于本章讨论的应用程序范围。

下图来一个应用程序的典型构成:


应用程序的典型模型

这是我理解画出的,跟书中的应用程序的主要方面的图并不一样。用户界面通过应用服务实现业务功能,应用服务把操作委托给领域模型(实体、值对像、聚合)、领域服务(可能不存在)、资源库。领域模型、领域服务、资源库是领域要素,是通用语言的表达,是接口定义。而真正的技术实现都由基础设施实现,基础设施屏蔽领域概念与技术实现,基础设施直接跟技术组件打交道,比如存储的DB、消息中间件等,领域模型(包括领域服务和资源库)是不直接跟技术组件打交道的。领域服务和资源库,会使用和组合领域模型(主要是聚合),分别完成业务逻辑和聚合存取。

用户界面

用户界面,称为UI,而一般为了给终端用户带来更好的操作体验,会实现带图形操作接口,即GUI,可以表现为web应用或桌面应用和移动端应用。

用户界面通常需要渲染多个聚合实例中的属性,但用户一次只会修改其中一个聚合实例。

可以通过数据传输对象(Data Transfer Object,DTO)或领域负载对象(Domain Payload Object,DPO)来组装多个聚合实例,DTO直接拷贝属性,类似深拷贝,DPO只拷贝聚合实体引用,所以前者适合需要序列化的场景(如RPC),后者适合单虚拟机应用架构中。

如果多聚合组装逻辑比较复杂且成本高,可以使用CQRS架构。

使用调停者发布聚合的内部状态。

可以使用数据转换器来处理针对不同类型客户端的输出。

展现模型(Presenation Model),是区别于视图模型的(View model),展现模型可以作为渲染视图的适配器,可以跟踪用户的编辑,是围绕着应用服务的一个最小化门面。展现模型,其实跟MVC架构中的C即Controller的职责很像。

应用服务

应用服务是领域模型的直接客户。应用服务应该做成很薄的一层,并且只使用它们来协调对模型的任务操作。

应用服务负责用例流的任务协调,每个用例流对应着一个应用服务方法。应用服务管理着事务、安全和任务委派等操作,把操作委派给领域模型。

应用服务方法参数可以直接使用领域对象吗?建议不使用,入参使用命令对象,命令对象属性使用基本数据类型,输出使用DTO。虽然会增加很多对象的生成和释放消耗。

应用服务可以使用独立接口,也可以把接口和实现定义在一个类中。应用服务一般不需要使用基础设施来实现。

基础设施

基础设施就是为领域模型(包括领域服务和资源库)提供技术实现。如前面应用程序定义的图形,基础设施实现了领域服务、资源库的接口乃至用户界面,直接于技术组件打交道。

基础设施的实现可以依赖注入或服务工厂来完成接口实现的查找。

企业组件容器

我也是只使用Spring的

组合多个限界上下文

组合多个限界上下文一节的问题是:UI需要组合多个模型,而三个模型位于三个限界上下文。如果使用一个应用服务来组合多个模型,因为是集成多个限界上下文的,所以这时候应用服务其实需要内建一个防腐层,并且“映射”出新的领域模型,这些新领域模型更多是运载数据属性的需要,所以容易产生贫血领域对象。如果是创建一些新的、清晰的限界上下文?这也增加不少复杂度,特别是会导致用户接口层对多个应用层的依赖。那到底该选择哪种方式呢?书中也没给出答案,只能根据自己的实际情况做决定。

而我为什么要把这一节放到最后来讲,其实还想说在微服务的思路下,服务进程拆得很细,可能一个聚合或一个资源库实现就会独立成一个服务进程,如果这时候把一个服务进程都当成一个上下文,那会使得应用程序的领域概念很复杂,所以下面提出一个思路,限界上下文是按领域来划分按通用语言的表达,而不是服务进程:


多服务进程的上下文

左图中的每一个非内嵌框图都是代表一个独立服务进程的微服务

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容