Advertisement

DDD学习资料(持续更新)

阅读量:

文章目录

  • DDD学习资料(持续更新)
    • DDD图书

    • DDD概念

    • DDD代码示例

    • 架构

    • Bounded Context

    • 工具

    • Event Storming

    • Event Storming图例

      • Event Storming Concepts Cycle
      • Big Picture Event Storming
      • Design Level Event Storming
      • Event Storming Use Case
      • Event Storming Sample (购物车支付例子)
    • 微服务设计与DDD

    • Spring与DDD

      • Domain Layer设计原则
      • 各层说明
        • Application 层
    • Domain 层

    • Infrastructure 层

    • UML

    • 公众号和社区专栏

      • 领域驱动设计十五年
    • 证据风暴 (Evidence Storming)

    • DDD的电商例子

      • Domain Model Example

DDD学习资料(持续更新)

DDD图书

DDD图书

  • 《领域驱动设计:软件核心复杂性应对之道》Eric Evans
  • 《实现领域驱动设计》Vaughn Vernon
  • 《Domain Driven Design Quickly》Abel Avran & Floyd Marinescu
  • 《领域驱动设计精粹》Vaughn Vernon

分析模式

  • 《分析模式:可复用的对象模型》Martin Fowler

面向对象

  • 《UML和模式应用》第9章 领域模型
  • 《UML精粹:标准对象建模语言简明指南》

DDD概念

DDD代码示例

架构

  • 三层架构 (UI层、Business Logic层、Data Access层)
  • DDD四层架构(UI层、Application层、Domain层、Infrastructure层)
  • 六边形架构 Hexagonal (Ports & Adapters) Architecture
  • 事件溯源架构(Event Sourcing)
  • 命令和查询职责分离(CQRS)
  • 响应式架构和Actor模型(Reactive)
  • 整洁架构(Clean Architecture)
  • 清晰架构(Explicit Architecture)

References:

Bounded Context

工具

UML

Event Storming

GOTO 2018 • 50.000 Orange Stickies Later • Alberto Brandolini

Alberto Brandolini - 100,000 Orange Stickies Later | Øredev 2019

Event Storming - Alberto Brandolini - DDD Europe 2019

Crunching ‘real-life stories’ with DDD & Event Storming - Kenny Baas-Schwegler - KanDDDinsky 2018

KanDDDinsky videos

Event Storming Wiki

A facilitators recipe for Event Storming

Event Storming - How to deal with complexity and improve your domain design

Virtual Domain-Driven Design

Event Storming: the first step of a business modernization journey with Cassie Shum

The Domain - First Pop Coffee Company

【领域驱动设计】事件风暴小体验

【领域驱动设计】从事件风暴到代码

DDD 建模工作坊指南

Decomposing the Monolith with Event Storming

Event Storming图例

Event Storming Concepts Cycle

Event Storming Concepts

Big Picture Event Storming

Big Picture Event Storming

Design Level Event Storming

Design Level Event Storming

Event Storming Use Case

Actor -> Command -> Aggregate -> Event -> Read Model -> UI
Event Storming Use Case

举例:

  • Actor, Command, Event (我,支付了订单,订单已经被支付了。)
  • Actor, Read Model, Command, Event (我,看见绿灯亮了,决定过马路 ,我已经过了马路)
  • Actor,Read Model,Command, Event(我,看了一下菜单,选了几个菜,我已经选好餐了)

Event Storming Sample (购物车支付例子)

Event Storming Sample

微服务设计与DDD

Bounded Contexts, Microservices, and Everything In Between - Vladik Khononov - KanDDDinsky 2018

Event Storming - Kick-Start Your Microservices Architecture

Designing Events-First Microservices

Creating event-driven microservices: the why, how and what by Andrew Schofield

GOTO 2019 • Event-Driven Microservices, the Sense, the Non-sense and a Way Forward • Allard Buijze

GOTO 2017 • The Many Meanings of Event-Driven Architecture • Martin Fowler

GOTO 2014 • Microservices • Martin Fowler

Developing microservices with aggregates - Chris Richardson

Microsoft Azure - 使用DDD设计微服务架构

ThoughtWorks | Testing Strategies in a Microservice Architecture

Martin Fowler | Software architecture guide

Building Domain Driven Microservices

Design a DDD-oriented microservice

Spring与DDD

Domain Layer设计原则

  • 可以独立开发而不需要依赖Spring Boot,不使用Spring bean injection, Spring annotations, Spring auto configuration
  • 可以独立测试而不需要依赖Spring Boot Test
  • 可以独立存取数据,而不需要关心数据库类型,比如关系型数据库或NoSQL
  • 可以独立发送和接收消息,而不需要关心消息代理类型,比如RabbitMQ或Kafka

各层说明

Application 层
  • Spring Controller (@RestController)
  • Spring Service (@Service) for Application Service
    Spring Configuration(@Configuration) for Application
Domain 层
  • Domain entities
  • Value objects
  • Domain object factories
  • Business rules
    (policy)
    Domain Services Repository interfaces
Infrastructure 层
  • Spring JPA entities (@Entity)

  • Repository implementation implements
    Repository interfaces defined in Domain Layer

  • Bean Configuration (@Configuration) for Domain Services

  • Spring Configuration (@Configuration) for Infrastructure, e.g.
    Database, Message broker

UML

公众号和社区专栏

领域驱动设计十五年

证据风暴 (Evidence Storming)

在Event Storming中会有事件风暴和命令风暴的活动。除此之外,还可以有证据风暴(Evidence Storming)。证据风暴就是找出业务流程中的单据、票据、凭证与合约。再通过这些证据审视是否遗漏了一些参与者、流程和领域模型。

通常

  • 这些证据也就是聚合。
  • 不同的证据往往是分支子流程。
  • 合约的开始生效、开始履行、履行结束、提前结束、变更、终止通常是重要的领域事件。
  • 对违约情况的处理则是分支子流程。
场景 证据(Evidence) 合约类型 当事人 作为…的证据 (AS Evidence)

| 网购| 订单| 买卖合约| 顾客、卖家| 订单作为顾客向卖家购买商品的证据。
顾客支付订单作为买卖合约开始生效的证据。
顾客确认收货作为买卖合约履行结束的证据。 |
| | 物流单| 运送合约| 快递公司、寄件人(仓库)、收件人(顾客)| 物流单作为快递公司接受寄件人委托,为收件人配送包裹的证据。
快递公司开出物流单,作为运送合约开始生效的证据。
收件人签收物流单作为运送合约成立的证据。 |

退货单 买卖合约规定的退货情形 (或退货合约) 顾客、卖家 退货单作为顾客收到货后,向卖家退货的证据。
宽带故障维修 报障单 租赁合约规定的售后情形(或售后合约) 宽带用户、客服 报障单作为客服受理宽带用户报障的证据。
维修单 租赁合约规定的售后情形(或售后合约) 客服、维修人员 维修单作为客服派工给维修人员的证据。

| | 维修单| 租赁合约规定的售后情形(或售后合约)| 维修人员、宽带用户| 维修单作为维修人员上门为宽带用户提供维修服务的证据。
宽带用户签字确认维修单,作为维修工作完成的证据。 |

出库单 仓库备品备件管理规定 仓库、维修人员 出库单作为维修人员从仓库领取备品备件的证据。
投诉单 租赁合约规定的投诉情形(或售后合约) 宽带用户、客服 投诉单作为客服受理宽带用户投诉的证据。

| 网约车| 订单| 租赁合约(或乘车合约)| 乘客、司机| 订单作为乘客要求司机提供乘车服务的证据。
司机接单作为乘车合约的开始生效。
乘客上车作为乘车合约的开始履行。
乘客到达目的地作为乘车合约的履行的结束。
乘客中途修改目的地为对乘车合约的变更。 |
|投诉单|租赁合约规定的投诉情形(或售后合约)|乘客、网约车平台|投诉单作为网约车平台受理乘客投诉的证据。||

| 网上挂号| 订单| 买卖合约(或挂号合约)| 病人/家属、医院| 订单作为病人/家属要求医院提供诊治的证据。
病人/家属支付订单作为挂号合约开始生效的证据。 |
|挂号单(纸质)|诊治合约|病人、医院|挂号单(纸质)作为病人已经到达医院,准备看诊(履约)的证据,也作为医院准备好为病人提供诊治服务的证据。||

| 乘坐飞机| 订单| 买卖合约(或购票合约)| 乘客、航空公司| 订单作为乘客要求航空公司提供乘机服务的证据。
乘客支付订单作为购票合约开始生效。
航空公司出票作为购票合约的完成。 |

机票 乘机合约 乘客、航空公司 机票作为航空公司为乘客提供乘机服务的合约。
行李托运单(一般附在纸质登机牌上) 行李托运合约 乘客、航空公司 行李托运单作为乘客委托航空公司随机运送行李的证据。
行程单 乘机合约规定的报销情形(或报销合约) 乘客、航空公司 行程单作为乘客要求航空公司提供的报销凭证。

DDD的电商例子

DDD最爱的电商例子。

电商流程:

  1. 浏览商品 (product),商品信息包括:商品名称(product title),规格尺寸(size/dimensions),价格(price)等。
  2. 把商品加入购物车(shopping cart)
  3. 结账(checkout),生成订单(place order)
  4. 付款(payment),付款时可使用优惠券(discount code)
  5. 扣减库存(inventory)
  6. 仓库收到订单(receive order),拣货(picking),打包(packing)
  7. 快递发货(shipping)
  8. 客户收货确认(shipping confirmation)
  9. 如果客户收到货后不满意,在符合退换货政策(return policy)的情况下,可发起退货(return)和退款(refund)

简单的总结就是围绕着“订单(合约)的生效,以及对订单(合约)的履约”:

  1. 客户:挑选商品,结账,付款,生成订单。
  2. 卖家/平台/仓库/快递:对订单进行履约(Order fulfilment process)。
  3. 客户:对订单履约情况进行评价,或发起售后。
  4. 卖家/平台/仓库/快递:响应客户的评价或售后流程。

责任说明:

  • 客户的责任:按照订单付款。
  • 平台的责任:第三方担保,处理购物纠纷,客户服务。
  • 卖家的责任:按照订单委托仓库发货。
  • 仓库的责任:按照订单打包发货,委托快递公司配送。
  • 快递公司的责任:按照快递单的信息配送,保证包裹送达。

合约包括:

  • 订单 (核心合约)
  • 支付记录 (可认为是订单合约的支付部分)
  • 快递单 (可认为是订单合约的配送部分)
  • 退换货政策 (可认为是订单合约的售后部分)

References:

Domain Model Example

用UML类图(class diagram)来表示领域模型。在概念模型阶段,UML类图的类定义可以只定义类名。到设计阶段,就需要定义UML类图的类的属性和方法。

常用的UML类图关系:

  • Association 关联 (实心线,无箭头)
  • Composition 组合(实心菱形线,无箭头),表示同生命周期,用来表达DDD的Aggregate
  • 一对零,一对一,一对多等关系 (如果存在多对多,通常意味着丢失了中间概念。)
  • 常见的中间概念有明细(item)、成员(member)和条目(entry)

Example:

参考文档:

全部评论 (0)

还没有任何评论哟~