建立领域模型步骤

  1. 根据提供的信息完善主要业务场景业务流程
  2. 根据业务流程识别领域事件并按照时序排列
  3. 针对领域事件进行命令识别
  4. 针对领域事件和命令进行聚合子域的初步识别;
  5. 在识别的subdomain中识别实体值对象实体间关系、调整聚合关系
  6. 针对领域模型识别限界上下文(Bounded Context)。

    三原则

  7. Focus on your core domain.
    Core domain:存在差异性竞争力的业务
  8. Iteratively explore models.
    方法:通过实践和软件(UML)
  9. speak ubiquitous language.
    方法:一种能合作的语言,业务术语(概念)

    实践

    1.信息

    2.业务场景图&业务流程图

  10. 领域事件
  • 业务事件
  • 时间序列
  • 所有的事件
  • 命名:聚合#动词的过去时
  1. 命令
  • 来源:
    ```
  1. UI 用户操作
  2. 外部系统触发
  3. 定时任务
    ```
  • 注意:
    ```
  1. cmd:event→1:1,推荐
  2. cmd:event→1:n,可以,尽量避免
  3. cmd:event→n:1,不可以
    ```
  • 命名:

    动词
  1. 聚合
  • 定义:生命周期相同的领域对象(实体、值对象)的集合。
  • 方法:可在cmd和event之间夹出聚合。
    ```
  1. 每个聚合都有一个根和一个边界。
  2. 每个聚合选择其中一个实体作为聚合根,本质是一个实体。
  3. 一个actor是一个聚合。
  4. 外部通过聚合根访问聚合内领域对象。
  5. 尽量小。
    ```
  6. 实体&值对象
  • 来源:领域对象,来源于业务概念。
  • 值对象:无id,状态不可变
    DDD中的值对象与C#的struct很像相似,是不是值对象应该使用struct?
    答:struct 作为一种技术选择,有时候也许可行,但或许更多时候是不可行,比如:struct不能为空,使得不能与领域对象对应。
  • 实体:有id,有状态
  1. 限界上下文
  • 识别:同一个对象,有时表达的含义不同时,此时可能需要两个限界上下文。
  • 尽量大
  • 跨限界上下文访问:RPC、REST、MQ
  • 尽量使子域和限界上下文对应。
  1. 技术对应
  • 子域、限界上下文对应项目(微服务的话,对应应用服务)
  • 聚合对应actor(或者对象类)
  • 推荐尽量一个实体对应一个聚合对应一个actor
  • 应用服务对应Controller API
  • 领域事件对应事件
  • 实体反映在数据库表结构
  • Repository类似DAO
  • DTO在应用层

RESTful架构下的API设计

1. 从命令出发

2. 从资源出发

RESTful架构下“资源”(resource)识别至关重要。在整个DDD建模中,聚合实体都是我们抽象资源的重要入手点。

这种方法比较适合识别Domain层的API设计。

3. 从业务流出发

API 最终都要满足业务的需求,所以也有API设计方法从流程节点的分析出发。

这种设计方法更适合Application层的API设计

4. 定义关键词动词描述

 

(如果有不正确的地方,希望童鞋指正)

(如果有不正确的地方,希望童鞋指正)

20190101.DDD笔记的更多相关文章

  1. MySql大表分页(附独门秘技)

    问题背景 MySql(InnoDB)中的订单表需要按时间顺序分页查询,且主键不是时间维度递增,订单表在百万以上规模,此时如何高效地实现该需求? 注:本文并非主要讲解如何建立索引,以下的分析均建立在有合 ...

  2. DDD领域驱动设计理论篇 - 学习笔记

    一.Why DDD? 在加入X公司后,开始了ASP.NET Core+Docker+Linux的技术实践,也开始了微服务架构的实践.在微服务的学习中,有一本微软官方出品的<.NET微服务:容器化 ...

  3. 阅读文章《DDD 领域驱动设计-如何 DDD?》的阅读笔记

    文章链接: https://www.cnblogs.com/xishuai/p/how-to-implement-ddd.html 文章作者: 田园里的蟋蟀 首先感谢作者写出这么好的文章. 以下是我的 ...

  4. Redis学习笔记~Redis事务机制与Lind.DDD.Repositories.Redis事务机制的实现

    回到目录 Redis本身支持事务,这就是SQL数据库有Transaction一样,而Redis的驱动也支持事务,这在ServiceStack.Redis就有所体现,它也是目前最受业界认可的Redis ...

  5. DDD学习笔记二

    参考:感谢博主的分享... http://www.cnblogs.com/netfocus/archive/2012/02/12/2347938.html DDD ==> 领域驱动设计(Doma ...

  6. DDD学习笔记一

    由于也是初学DDD,难免有很多不足和认识错误的地方.多数内容来自其他网络资料或者书籍. 参考:http://www.cnblogs.com/Leo_wl/p/4418663.html 希望多多提出宝贵 ...

  7. 领域驱动设计(DDD)笔记(一)

      最近在看<领域驱动设计>这本书,准备写点学习笔记博文记录系列.记录本书中的要点和疑惑,不定期更新!先放张MarginNote的图: Aggregate  每个Aggregate 都有一 ...

  8. DDD学习笔记1——分层架构

    新旧架构对比图: DDD中的基础设施层包括数据持久化(ORM数据访问),IoC容器实现,AOP实现(安全,日志记录,缓存等) Repository的接口通常放在领域层,具体实现在基础设施层 旧架构的业 ...

  9. DDD学习笔记(一)

    最近开始筹备一个电商项目. 其实是公司的老本行了. 但今年公司希望在做项目的同时, 沉淀出一套针对电商的基础产品. 这样可以提高新项目的开发效率, 减少重复劳动. 那现如今, DDD(领域驱动设计)应 ...

随机推荐

  1. vs2017 cordova调试ios app

    https://docs.microsoft.com/en-us/visualstudio/cross-platform/tools-for-cordova/first-steps/ios-guide ...

  2. ORA-09925: Unable to create audit trail file

    当我修改ORACLE_SID为新的SID,想进行数据库还原时,用sqlplus报如下错误 [oracle@dbtest ~]$ sqlplus / as sysdba SQL Production : ...

  3. 把握每次机会,麒麟芯片5年成就高端(SoC包括AP、基带、ISP等,华为确实牛)

    从2016年11月华为Mate 9 /Mate 9 Pro发布,到2017年2月荣耀V9和华为P10 /P10 Plus 相继发布,这几款都是华为和荣耀的高端旗舰机型,且搭载的都是华为最新旗舰芯片-- ...

  4. Raknet是一个基于UDP网络传输协议的C++网络库(还有一些其它库,比如nanomsg,fastsocket等等)

    Raknet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务.通常情况下用于游戏,但也可以用于其它项目. Raknet有以下好处: 高性能 在同一台计算机 ...

  5. virtualbox 安装 extension pack 方法以及出现 "The installer failed with exit code 1: VBoxExtPackHelperApp.exe: error: Failed to rename the temporary directory to the final one"的解决办法

    virtualbox 的版本:5.1.26    下载地址:https://www.virtualbox.org/wiki/Downloads extension pack 的版本:5.1.26   ...

  6. Delphi 7下IGDIPlus库的使用

    IGDI+是一个免费开源封装微软GDI+功能的Delphi库,该库使得可以用Delphi语言代码快速简短的实现复杂GDI+应用程序.官方网站:http://www.mitov.com/html/igd ...

  7. Spring中如何获取request的方法汇总及其线程安全性分析

    前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性.下面话不多说了,来一起看看详细的介绍吧. 概述 在使用Spring MVC开发Web系统 ...

  8. jquery测试文档

    Jquery版本:* jQuery JavaScript Library v1.3.2 * http://jquery.com/ 引用:<script src="JS/jquery.j ...

  9. GO方法与接口

    Go语言没有沿袭传统面向对象编程中的诸多概念,比如继承.虚函数.构造函数和析构函数.隐藏的this指针等. 方法 Go 语言中同时有函数和方法.方法就是一个包含了接受者(receiver)的函数,re ...

  10. SYN2306型 北斗串口时间服务器

    SYN2306型  北斗串口时间服务器  北斗授时设备北斗时钟同步系统使用说明视频链接: http://www.syn029.com/h-pd-108-0_310_36_-1.html 请将此链接复制 ...