实现领域驱动设计----第三、四章


上下文映射图主要帮助我们从解决方案空间的角度看待问题。

  • 防腐层(Anticorruption Layer):在集成两个审计良好的限界上下文时,翻译层可能很简单,甚至可以很优雅地实现。但是,当共享内核,合作关系或客户方-供应方关系无法顺利实现时,此时地翻译将变得复杂。对于下游客户来说,你需要更具自己地领域模型创建一个单独地层,该层作为上游系统地委派向你地系统提供功能。防腐层通过已有地接口与其他系统交互,而其他系统只需要做很小地修改,设置无须修改。在防腐层内部,它在你自己的模型和他方模型之间进行翻译转化。
  • 开放主机服务(open Host Service):定义一种协议,让你的子系统通过该协议来访问你的服务。你需要将该协议公开,这样任何想与你集成的人都可以使用该协议。在有新的集成需求时,你应该对协议进行改进或者扩展。对于一些特殊的需求,你可以采用一次性的翻译予以处理,这样可以保持协议的简单性和连贯性。
  • 发布语言(Published Language):在两个限界上下文之间翻译模型需要一种公用的语言。此时你应该使用一种发布出来的共享语言来完成集成交流。发布语言通常与开放主机服务一起使用。


在这里插入图片描述

**严格分层架构(Strict Layers Architecture)**中,某层只能与直接位于其下方的层发生耦合;

松散分层架构(Relaxed Layers Architecture),允许任意上方层与任意下方层发生耦合。

在这里插入图片描述

依赖倒置原则

依赖倒置原则(Dependency Inversion Principle,DIP):
高层模块不应该依赖底层模块,两者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

六边形架构(端口与适配器)

我们通常将客户与系统交互的地方称为“前端”;同样,我们将系统中获取存储持久化数据和发送输出数据的地方成为“后端”。但是,六边形架构提倡用一种新的视角来看待整个系统,该架构中存在两个区域,分别时“外部区域”和“内部区域”。在外部区域中,不同的客户均可以提交输入;而内部的系统则用于获取持久化数据,并对程序输出进行存储(比如数据库),或者在中途将输出转发到另外的地方(比如消息)。

面向服务架构


REST

REST和DDD
RESTful HTTP是具有诱惑力的,但是我们并不建议将领域模型直接暴露给外界,因为这样会使系统接口变得非常脆弱,原因在于对领域模型的每次改变都会导致对系统接口的改变。要将DDD与RESTful HTTP合并起来使用,我们有两种方式。
第一种方法是为系统接口层单独创建一个限界上下文,再在此上下文中通过适当的策略来访问实际的核心模型。

另一种方法用于需要使用标准媒体类型的时候。如果某种媒体类型并不用于支持单个系统接口,而是用于一组相似的客户端-服务端交互场景,此时我们可以创建一个领域模型来处理每一种媒体类型。

第一种方法比较适合更加专属的系统,而第二种方法更适合那些通用的系统。

为什么是REST
符合REST原则的系统将具有更好的松耦合性。添加新资源并在已有资源中创建到新资源的链接是非常简单的。要添加新的格式同样如此。另外,基于REST的系统也是非常容易理解的,因为此时系统被分为很多较小的资源块,每个资源块都可以独立地测试和调试,并且每一个资源块都表示了一个可重用地入口点。HTTP设计本身以及URI成熟地重写与缓存机制使得RESTful HTTP成为一种不错地架构选择,该架构具有很好的松耦合性和可伸缩性。

命令和查询职责分离-----CQRS(Cammand-Query Responsibility Segregation)
从资源库中查询所有需要显示的数据是困难的,特别是在需要显示来自不同聚合类型与实例的数据时。领域越复杂,这种困难程度越大。CQRS是将紧缩(Stringent)对象(或者组件)设计原则和命令-查询分离(CQS)应用在架构模式中的结果。

处理具有最终一致性的查询模型
一种方式是让用户界面临时性的显示先前提交给命令模型的参数,这使得用户可以及时地看到将来对查询模型地改变。这种方式有可能是唯一能够避免用户界面显示陈旧数据地方式。

另一种方法是显示地在用户界面上显示出当前查询模型的日期和时间。要达到这样的目的,查询模型的每一条记录都需要维护最后更新时的日期和时间。

管道和过滤器

以下的shell命令便是一种最简单的管道和过滤器:

cat phone_numbers.txt | grep 303 | wc -l

统计在phone——number.txt文件中统计含有电话区号“303”的所有文本行的数量。该命令同时使用了管道和过滤器:

  1. cat命令工具用于向标准输出流(Standard Output Stream)输出phone_numbers.txt文件中的内容。标准输出流与终端相连。在使用“|”符号之后,输出将会通过管道转向下一个命令工具。
  2. grep命令从标准输出流中读取数据,此时的标准输出流即是cat命令的输出结果。grep命令查找到的所有结果都将输出到标准输出流。和cat命令一样,grep命令的输出流通过管道被转向到下一个wc命令。
  3. wc命令读取标准输出流,命令的参数为“-l”,表示统计所读行的数量。此时的输出直接显示在了终端,因为在wc命令之后没有另外的管道了。



长时处理过程(也叫Saga)
## 数据网织和基于网格的分部署计算

对于缓存冗余性的工作机制,这里有一个例子:其中一个节点作为主缓存,其他节点作为二级缓存。如果主缓存失效,其中一个耳机缓存将会成为新的主缓存。当先前失效的主缓存恢复之后,新主缓存中的数据将被复制到恢复后的缓存中,此时该恢复后的缓存将变为二级缓存。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值