二领域驱动设计~战术篇

Posted 戴泽supp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二领域驱动设计~战术篇相关的知识,希望对你有一定的参考价值。

二、领域驱动设计~战术篇

1、前言

这篇文章主要关注的是领域驱动设计(DDD)代码设计实施上的一些设计概念和原则。

是从技术视角出发,侧重于领域模型的技术实现,完成软件开发和落地,包括:聚合根、实体、值对象、领域服务、应用服务和资源库等概念解释和代码逻辑的设计和实现。

战略篇请参考:一、领域驱动设计-战略篇

2、战术设计阶段:DDD 中的重要的一些概念

1)、实体

  • 有唯一标识符,就算其他所有属性完全相同,只要标识符不一致就是不同的实体,标识符一致就是同一个实体,我们把这样的对象称为实体。

2)、值对象

  • 没有唯一标识符,只要属性一致,就是同一个值对象
  • 值对象与实体区别如下图

3)、应用服务

  • 服务协调多个领域服务和聚合及对其他微服务调用

4)、领域服务

  • 无法划分到实体和应用服务的行为方法,比如跨多个实体的业务逻辑(类似于Service层的类)
  • 领域服务和上文中提到的应用服务是不同的,领域服务是领域模型的一部分,而应用服务不是。应用服务是领域服务的客户端,它将领域模型变成对外界可用的软件系统。

5)、领域事件

  • 用最终一致性取代了事务一致性,通过领域事件的方式达到各个组件之间的数据一致性
  • 领域事件的命名遵循英语中的“名词+动词过去分词”格式,即表示的是先前发生过的一件事情。比如,购买者提交商品订单之后发布 OrderCreated 事件,用户支付 TradePaid 事件

6)、聚合 & 聚合根

聚合

  • 聚合是业务和逻辑紧密关联的实体和值对象的组合
  • 跨多个实体的业务逻辑通过领域服务来实现,跨多个聚合的业务逻辑通过应用服务来实现
  • 聚合的特点:高内聚、低耦合,它是领域模型中最底层的边界,可以作为拆分微服务的最小单位

聚合根

  • 聚合根的特点:聚合根是实体,有实体的特点,具有全局唯一标识,有独立的生命周期
  • 一个聚合只有一个聚合根,所有外部对聚合的访问都要通过聚合根

7)、工厂

  • 工厂封装复杂实体的创建逻辑,都是对领域对象的生命周期进行管理.

8)、资源库

  • 资源库包括但不限于传统的 dao 接口(数据库/内存/redis缓存/其他资源)

9)、防腐层

  • 当你的领域和其他领域存在数据交互时,你需要一个防腐层作为两个领域之间的纽带。这会给你带来很多“数据转换”的代码,但是对于业务多变的系统来讲,它能保护你的领域,这是值得的。
  • 防腐层主要起到隔离的作用

10)、模块

  • 就是项目中的 package
  • 一个模块用于存放领域中内聚在一起的类,模块之间松耦合
  • 模块应该根据通用语言来命名,且应与领域概念保持协调一致
  • 同层模块之间,尽量杜绝循环依赖

以上是关于二领域驱动设计~战术篇的主要内容,如果未能解决你的问题,请参考以下文章

领域驱动设计--战术模式简介

去哪儿网领域驱动设计(DDD)战略战术设计实战

去哪儿网领域驱动设计(DDD)战略战术设计实战

去哪儿网领域驱动设计(DDD)战略战术设计实战

领域驱动设计 - 战术设计 - 3/3聚合与模型的构建方法

DDD领域驱动设计落地实践系列:战略设计和战术设计