第8章 应用程序架构

第8章 应用程序架构

之前,介绍了让团队可以对问题域的有用概念抽象建模的技术。

不过,这一章将介绍可以在应用程序上下文中利用领域模型的模式,其中考虑到了持久化,展现以及其他技术需求。

 

  1. 应用程序架构

遵循DDD原则开发软件不需要使用任何特殊的应用程序架构方式,但架构必须支持的一项内容是保持领域逻辑的隔离性。

 

    1. 分离应用程序的问题

应用程序的结构要支持技术复杂性和领域复杂性的分离。

出于不同的原因,应用程序的展现,持久化和领域逻辑问题会以不同速率发生变化;能分离这些问题的架构可以适应变化而不会造成对代码库不相关区域的意外影响。

 

    1. 从领域的复杂性中进行抽象

除了问题的分离,应用程序架构必须通过公开封装和隐藏低层次领域详情的粗粒度用例集成从复杂领域的纷乱难点中进行抽象。在较高层次进行抽象可以防止领域逻辑中的变化影响展现层。

 

    1. 分层架构

为了支持问题的分离,可以对应用程序的不同职责进行分层。

许多架构通过将应用程序划分成一起变化的区域来支持问题分离,包括整洁架构,六角形架构(也称为端口和适配器架构),以及洋葱架构。

 

    1. 依赖倒置

为强制进行问题分离,位于架构中的领域层和应用层不应该依赖任何其他层。所有的依赖关系都是内向的,其中处于应用程序核心的领域层不依赖任何事物,使得它能够不受干扰地专注于领域问题。应用层仅依赖于领域层,它通过委托给领域层来组织对用例的处理。

 

    1. 领域层

领域模型表示了创建来满足业务用例需求的问题域的概念抽象视图。

包含抽象模型的领域层不依赖任何其他事物,并且不清楚它所服务的客户端的技术细节以及保持领域对象的数据存储。

 

    1. 应用程序服务层

应用程序服务层表示了应用程序的用例和行为。

应用程序服务层使得在不损坏领域层完整性的情况下对完全不同的客户端的支持成为可能。

 

    1. 基础架构层

应用程序的基础架构层就是让其生效的技术详情。

 

    1. 跨层通信

在跨层通信时,为避免向外界公开领域模型的详情,请不要跨边界传递领域对象。也不要将外界的非法请求或用户输入数据发送至领域层。要使用简单的数据传输对象DTO,展现模型以及应用程序事件对象在领域中就变化和操作进行通信。

 

    1. 隔离测试

 

    1. 不要在有界上下文之间共享数据结构

除了分离应用程序代码中的问题之外,架构还必须包括来自其他应用程序数据请求的领域对象状态的持久化分离。

以下显示了共享数据库和共享结构集成应用程序。

最好不要共享数据库,应该选择应用程序或有界上下文数据库而不是集成数据库。

就像在领域模型内应用有界上下文一样,必须对持久化模型进行相同的处理。

这有助于强制客户端通过精心定义的应用程序服务层集成,从而保护模型的完整性并确保满足恒定性需求。

 

 

    1. 应用程序架构与用于有界上下文的架构的对比

下面第一张图,显示了由3个有界上下文组成的应用程序;此处展现层包含其专有的应用层以保持与有界上下文保持一致。

第二张图,相信有界上下文应该扩展到展现层。

 

 

  1. 应用程序服务

 

    1. 应用程序逻辑与领域逻辑的对比

应用程序逻辑包含满足业务用例所需的工作流步骤。

这些步骤可以包含融合来自一个数据库的领域对象,将用户输入映射到领域层理解的对象,以及最后委托给领域对象或者其集合以便制定业务决策。

应用程序逻辑完全在于通过委托给领域和基础架构服务来进行协调和编排。

领域逻辑仅专注于领域规则,概念,信息和工作流。领域逻辑没有技术细节,也没有持久化。

    1. 定义和公开能力

由于应用程序服务是系统公开的能力,所以他们不必适应新的客户端。

相反,像展现层这样的新客户端应该遵从服务公开的约定。

 

    1. 业务用例协作

尽管领域模型就其本质来说是面向对象的,但应用程序服务是程序性的,因为它们专注于任务编排而不是对领域逻辑和概念建模。

 

    1. 应用程序服务表示的是用例,而不是创建,读取,更新和删除

行为驱动设计(BDD)会帮助你理解应用程序的行为。

有了用BDD捕获的行为,就可以将在BDD规范中明确表示语言用于应用程序服务用途/用例的名称。

应用程序服务不是简单的CURD,他们应该揭示用户意图并传达系统的能力。

 

    1. 作为实现详情的领域层

应用程序服务是强有力的,并且对所有应用程序复杂性都有帮助,它要么富含逻辑的核心子域,要么仅仅是用于访问数据存储的外观模式的一个通用子域。

    1. 领域报告

除了协调业务任务,应用程序服务层还需要以报告形式提供关于领域对象状态的信息。

 

    1. 读取模型和事务模型的对比

有时用户界面会需要跨越许多领域对象的信息。

应用程序服务融合所有的丰富领域对象仅仅为视图提供信息的子集,这样的做法是低效且成本高昂的。

 

  1. 应用程序客户端

应用程序服务层客户端的作用是公开系统的能力。

无论客户端应用程序是Web服务,还是RESTful等,应用程序都是应该无感知的。

 

 

 

 

  1. 要点汇总

外围层依赖内部层。内部层会公开外围层必须遵从和实现的接口。这一依赖倒置形式将保护领域和应用层的完整性。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值