20190101.DDD笔记
建立领域模型步骤
- 根据提供的
信息完善主要业务场景和业务流程; - 根据业务流程识别
领域事件并按照时序排列; - 针对领域事件进行
命令识别; - 针对领域事件和命令进行
聚合和子域的初步识别; - 在识别的subdomain中识别
实体、值对象、实体间关系、调整聚合关系; - 针对领域模型识别
限界上下文(Bounded Context)。
三原则
- Focus on your core domain.
Core domain:存在差异性竞争力的业务
- Iteratively explore models.
方法:通过实践和软件(UML)
- speak ubiquitous language.
方法:一种能合作的语言,业务术语(概念)

实践
1.信息
2.业务场景图&业务流程图 - 领域事件
- 业务事件
- 时间序列
- 所有的事件
- 命名:聚合#动词的过去时
- 命令
- 来源:
```
- UI 用户操作
- 外部系统触发
- 定时任务
```
- 注意:
```
- cmd:event→1:1,推荐
- cmd:event→1:n,可以,尽量避免
- cmd:event→n:1,不可以
```
- 命名:
动词
- 聚合
- 定义:生命周期相同的领域对象(实体、值对象)的集合。
- 方法:可在cmd和event之间夹出聚合。
```
- 每个聚合都有一个根和一个边界。
- 每个聚合选择其中一个实体作为聚合根,本质是一个实体。
- 一个actor是一个聚合。
- 外部通过聚合根访问聚合内领域对象。
- 尽量小。
``` - 实体&值对象
- 来源:领域对象,来源于业务概念。
- 值对象:无id,状态不可变
DDD中的值对象与C#的struct很像相似,是不是值对象应该使用struct?
答:struct 作为一种技术选择,有时候也许可行,但或许更多时候是不可行,比如:struct不能为空,使得不能与领域对象对应。
- 实体:有id,有状态
- 限界上下文
- 识别:同一个对象,有时表达的含义不同时,此时可能需要两个限界上下文。
- 尽量大
- 跨限界上下文访问:RPC、REST、MQ
- 尽量使子域和限界上下文对应。
- 技术对应
- 子域、限界上下文对应项目(微服务的话,对应应用服务)
- 聚合对应actor(或者对象类)
- 推荐尽量一个实体对应一个聚合对应一个actor
- 应用服务对应Controller API
- 领域事件对应事件
- 实体反映在数据库表结构
- Repository类似DAO
- DTO在应用层
RESTful架构下的API设计
1. 从命令出发
2. 从资源出发
RESTful架构下“资源”(resource)识别至关重要。在整个DDD建模中,聚合和实体都是我们抽象资源的重要入手点。
这种方法比较适合识别Domain层的API设计。
3. 从业务流出发
API 最终都要满足业务的需求,所以也有API设计方法从流程节点的分析出发。
这种设计方法更适合Application层的API设计
4. 定义关键词动词描述
(如果有不正确的地方,希望童鞋指正)
(如果有不正确的地方,希望童鞋指正)
20190101.DDD笔记的更多相关文章
- MySql大表分页(附独门秘技)
问题背景 MySql(InnoDB)中的订单表需要按时间顺序分页查询,且主键不是时间维度递增,订单表在百万以上规模,此时如何高效地实现该需求? 注:本文并非主要讲解如何建立索引,以下的分析均建立在有合 ...
- DDD领域驱动设计理论篇 - 学习笔记
一.Why DDD? 在加入X公司后,开始了ASP.NET Core+Docker+Linux的技术实践,也开始了微服务架构的实践.在微服务的学习中,有一本微软官方出品的<.NET微服务:容器化 ...
- 阅读文章《DDD 领域驱动设计-如何 DDD?》的阅读笔记
文章链接: https://www.cnblogs.com/xishuai/p/how-to-implement-ddd.html 文章作者: 田园里的蟋蟀 首先感谢作者写出这么好的文章. 以下是我的 ...
- Redis学习笔记~Redis事务机制与Lind.DDD.Repositories.Redis事务机制的实现
回到目录 Redis本身支持事务,这就是SQL数据库有Transaction一样,而Redis的驱动也支持事务,这在ServiceStack.Redis就有所体现,它也是目前最受业界认可的Redis ...
- DDD学习笔记二
参考:感谢博主的分享... http://www.cnblogs.com/netfocus/archive/2012/02/12/2347938.html DDD ==> 领域驱动设计(Doma ...
- DDD学习笔记一
由于也是初学DDD,难免有很多不足和认识错误的地方.多数内容来自其他网络资料或者书籍. 参考:http://www.cnblogs.com/Leo_wl/p/4418663.html 希望多多提出宝贵 ...
- 领域驱动设计(DDD)笔记(一)
最近在看<领域驱动设计>这本书,准备写点学习笔记博文记录系列.记录本书中的要点和疑惑,不定期更新!先放张MarginNote的图: Aggregate 每个Aggregate 都有一 ...
- DDD学习笔记1——分层架构
新旧架构对比图: DDD中的基础设施层包括数据持久化(ORM数据访问),IoC容器实现,AOP实现(安全,日志记录,缓存等) Repository的接口通常放在领域层,具体实现在基础设施层 旧架构的业 ...
- DDD学习笔记(一)
最近开始筹备一个电商项目. 其实是公司的老本行了. 但今年公司希望在做项目的同时, 沉淀出一套针对电商的基础产品. 这样可以提高新项目的开发效率, 减少重复劳动. 那现如今, DDD(领域驱动设计)应 ...
随机推荐
- Objective
1.NSSet 1.是一个无序的,管理多个对象的集合类,最大特点 是集合中不允许出现重复对象,和数学上的集合含义是一 样的 2.除了无序.不许重复之外,其它功能和NSArray是一样的 2.NSArr ...
- Win8 Metro(C#)数字图像处理--2.58双峰法图像二值化
原文:Win8 Metro(C#)数字图像处理--2.58双峰法图像二值化 [函数名称] 双峰法图像二值化 WriteableBitmap PeakshistogramThSegment( ...
- Win8Metro(C#)数字图像处理--2.25二值图像距离变换
原文:Win8Metro(C#)数字图像处理--2.25二值图像距离变换 [函数名称] 二值图像距离变换函数DistanceTransformProcess(WriteableBitmap sr ...
- QDialog之屏蔽Esc键(简单深刻,要么重写keyPressEvent然后break忽略此事件,要么重写eventFilter然后return,都是为了忽略此事件)
简述 Qt中Esc键会在一些控件中默认的进行一些事件的触发,比如:QDialog,按下Esc键窗口消失.大多数情况下,我们不需要这么做,那么就需要对默认事件进行屏蔽. 简述 源码分析 事件过滤器 事件 ...
- VS2015设置VS2017的“快速操作”快捷键Alt+Enter
选项 - 环境 - 键盘 - 视图.快速操作和重构 添加“Alt+Enter (文本编辑器)”
- Android零基础入门第19节:Button使用详解
原文:Android零基础入门第19节:Button使用详解 Button(按钮)是Android开发中使用非常频繁的组件,主要是在UI界面上生成一个按钮,该按钮可以供用户单击,当用户单击按钮时,按钮 ...
- mysql 更改root密码
mysql 更改root密码,有很多种,网上也有很多记录,这里只是做个记录,以后可以看看,只记录两种自己常用的方法. 1.改表法,登录到数据库,切换到:mysql数据库,update user set ...
- nyoj7——街区最短问题
描述 一个街区有很多住户,街区的街道只能为东西.南北两种方向. 住户只可以沿着街道行走. 各个街道之间的间隔相等. 用(x,y)来表示住户坐在的街区. 例如(4,20),表示用户在东西方向第4个街道, ...
- spring bean 加载过程(spring)
以classpathXmlApplication为例 入口方法包含3个部分, public ClassPathXmlApplicationContext(String[] configLocation ...
- delphi 在多线程中使用 CreateOleObject 导致失败(一定要使用CoInitialize和CoUninitialize,举例查询WMI)
原帖地址 http://bbs.csdn.net/topics/390481350 解决办法 procedure DisplayVideoInfo; var wmi, objs, obj : OleV ...