学习DDD的初步尝试,从最基础的开始,业务介绍,划分限界上下文 ,建立模型
Conference业务简介
Conference是这样一个系统,它提供了一个在线创建会议以及预订会议座位的平台。这个系统的用户有两类:
1:客户,可以创建和管理会议。
2:会议座位预定者,可以预订会议座位。
具体的关键业务描述如下:
1.客户登陆系统,客户可以创建一个会议,并录入会议的基本信息,比如名称、时间段、地点,参会人数等。
2.客户定义某个会议的座位类型,可以定义多个,每个座位类型包含的信息有:名称、座位价格、座位数量 ,根据座位类型自动生成座位编号。
3.客户发布或取消发布某个会议,当一个会议发布后,预订者就可以在线预订会议的座位了;如果取消发布,则该会议对预订者不可见。
4.预订者在预订会议座位时,会生成订单,订单需要进行支付才会生效。
5.订单生成后,预订者可以有15分钟的时间付款,超过15分钟,订单预定的座位就会回收,允许其他人预定。
6.预订者成功预订了座位后,可以指定每个座位的实际参会人信息;
7.客户(会议的Owner)可以管理他创建的每个会议的所有订单,比如可以查看该会议的所有订单以及参会人信息,以方便联系参会人;
这个案例是汤总的Conference案例,案例地址: https://www.cnblogs.com/netfocus/p/4591407.html ,案例源码地址:https://github.com/tangxuehua/Conference
这个案例是汤总的博客,这里有一些小改动,因为自己前面写了一个RBAC权限的简单小DEMO,可能会融入进来,以前都是拿到需求基本上都是直接建表,开发,很少分析,第一次真正的尝试,希望大家能指出缺点,一起交流沟通。
后面会写出这个案例Demo,打算从最基础的开始,因为在写的过程中一定会有收获,带个问题去解决,总比不去尝试的好,看起来简单的东西,一去实践会发现困难重重,看起来难的东西,不断的去尝试,会发现其实并没有想象的难
业务流程梳理,上下文划分
1.发现业务概念,画出业务流程图
2.找出业务场景,根据角色,画出用例图 (用户故事),根据场景的语义相关性,以及业务相关性,将场景归类 (将业务分类,不要太过于纠结,后面分析可以完善)限界上下文
3.分析每一个业务场景,找出场景中的参与者 ,参与者的基本特征 ,分析场景中交互的过程,识别业务场景中的规则,分析状态变化的影响,比如(取消会议,对预定者不可见),状态比较复杂时:可以考虑画出状态变迁的流程图或者以其他方式表达出变化的过程,比如(订单状态的变化),识别出聚合根,实体,值对象 ,领域服务 ,领域事件
4.分析多个场景之间的交互过程与方式,以及交互过程中产生的影响,确实协作的方式,画出 上下文映射图 ,比如(订单和支付场景,支付成功之后,通知订单,改变状态)
一:发现业务概念,画出业务流程图

二:找出业务场景,根据角色,画出用例图 (用户故事),根据场景的语义相关性,以及业务相关性,将场景归类 (将业务分类,不要太过于纠结,后面分析可以完善)限界上下文
业务场景:
1,客户创建会议 2,客户定义会议座位类型,生成座位号 3,客户发布会议 4,客户取消会议 5,预定者预定会议 6,生成订单 7,订单支付 8,指定座位参会人信息
用例图:


场景归类:

三:分析每一个业务场景,找出场景中的参与者 ,参与者的基本特征 ,分析场景中交互的过程,识别业务场景中的规则,分析状态变化的影响,比如(取消会议,对预定者不可见),状态比较复杂时:可以考虑画出状态变迁的流程图或者以其他方式表达出变化的过程,比如(订单状态的变化),识别出聚合根,实体,值对象 ,领域服务 ,领域事件
ConferenceContext
一:客户创建会议
参与者:客户 ,会议 ,座位类型 ,座位
客户 Customer:Id ,CustomerId ,CustomerName ,CustomerAddress ,CustomerPassWord (聚合根)
会议 Conference:Id ,ConferenceName ,ConferencePublishStatus , ConferenceStrartTime , ConferenceEndTime , ConferenceAddress,ConferenceContent ,CustomerId ,ConferenceParticipantNum,SeatTypeList (聚合根)
规则:
1,客户必须登陆系统,创建会议时,客户必须在系统中存在
二:客户定义座位类型
参与者:客户 ,会议 ,座位类型 ,座位
座位类型 SeatType:Id ,SeatTypeName ,SeatTypePrice ,SeatTypeNum ,ConferenceId , SeatList 实体
座位 Seat:Id ,SeatNumber , SeatTypeId 实体
规则:
1,客户定义座位类型的数量,不能超过会议的参会人数
2,座位编号随机生成,不允许出现重复编号,最大编号不能超过会议参会人数
交互过程以及影响:座位类型成功后,根据规则生成座位号
三:客户发布会议,取消会议
参议者:客户 ,会议
作为会议的状态
规则:
3,客户没有定义座位类型,不能发布会议
4,发布会议,对预定者可见 ,取消会议,对预订者不可见
交互过程以及影响:发布会议后,会改变会议的状态为:已发布,对预定者可见,取消会议,会改变会议的状态为:未发布 ,对预订者不可见
预订者在预订会议座位,生成订单,订单需要进行支付才会生效
1,预定者,登陆会议系统
2,浏览已发布的会议
3,选择要预定的会议
4,选择要预定的会议座位类型
4,选择要预定的座位(可以选择多个座位)
5,点击提交,生成订单
6,系统处理订单
7,进入支付的页面,用户确认支付信息
8,用户点击确认支付,
9,系统处理支付,成功时:修改支付的状态为:已支付,发送一个事件通知订单,订单扣除会议座位,修改订单的状态为:支付订单成功
失败时:修改支付的状态为:支付失败,发送一个事件通知订单,修改订单的状态为:支付订单失败,回收会议座位
10,用户点击拒绝支付,修改支付的状态为:已拒绝,发送一个事件通知订单,订单回收会议座位,修改订单的状态为:拒绝支付
11,订单超过15分钟未支付,修改订单的状态为:支付已超时
ScheduledContext
预定会议座位 ,生成订单
参与者:预定者 ,订单 ,订单明细,会议 ,会议座位类型 ,会议座位
预定者(PredestineUser):Id ,PredestineUserName ,PredestineUserPhone ,PredestineUserPassWord 聚合根
订单 (Order):Id , ConferenceId , PredestineUserId , OrderTotalPrice , CreateTime , OrderStatus ,OrderItemList
订单明细(OrderItem)Id ,OrderId ,SeatId ,SeatPrice
规则:
1,会议的状态必须是发布的状态
2,订单中必须包含一条订单明细的信息
3,预定座位时检测座位是否被选择
4,预定成功后,15分钟必须支付,过期回收预定的座位
订单的状态:
1.已生成订单 (初始化状态)
2.预定座位成功 (预定成功,预扣会议座位,记录预定成功的时间,修改订单状态为:预定座位成功)
3.预定座位失败 (预定失败,修改订单状态为:预定座位失败)
4.支付已超时 (订单支付超时,回收的会议座位,修改订单状态为:支付已超时)
5.支付订单成功 (扣除会议座位,修改订单状态为:支付订单成功)
6.拒绝支付 (预定者拒绝支付,回收会议座位,修改订单状态为:拒绝支付)
PayContext
支付订单
参与者:订单 ,支付
支付(Pay):Id ,OrderId ,PayPrice , PayStatus , PayCreateTime 聚合根
支付明细(PayItem): Id , PayId , SeatId , SeatPrice 实体
规则:
1.支付时验证余额
支付的状态:1, 待支付 2, 支付成功 3, 拒绝支付 4, 支付失败
交互过程:
1,系统处理支付,成功时:修改支付的状态为:已支付,发送一个事件通知订单,订单扣除会议座位,修改订单的状态为:支付订单成功
失败时:修改支付的状态为:支付失败,发送一个事件通知订单,订单回收会议座位,修改订单的状态为:支付订单失败
2,用户点击拒绝支付,修改支付的状态为:已拒绝,发送一个事件通知订单,订单回收的会议座位,修改订单的状态为:拒绝支付
3,订单超过15分钟未支付,修改订单的状态为:支付已超时
指定座位实际参会人信息
参与者:订单 ,座位 ,参会人
订单座位(OrderSeat):Id ,OrderId ,ParticipantName ,ParticipantPhone 聚合根
4.分析多个场景之间的交互过程与方式,以及交互过程中产生的影响,确实协作的方式,画出 上下文映射图 ,比如(订单和支付场景,支付成功之后,通知订单,改变状态)

学习DDD的初步尝试,从最基础的开始,业务介绍,划分限界上下文 ,建立模型的更多相关文章
- DDD中限界上下文与通用语言的作用
什么是通用语言 通用语言, 最主要的目的就是减少交流中信息丢失, 在实际开发中, 可能关联很多人, 例如有业务层面的业务细节制定者.领域专家.产品经理.项目经理 .架构师.开发经理.测试经理等等, 即 ...
- DDD理论学习系列(3)-- 限界上下文
1. 引言 限界上下文可以拆分为两个词,限界和上下文. 限界:是指一个界限,具体的某一个范围. 上下文:个人理解就是语境. 比如我们常说的段子: "我想静静." 这个句子一般是想表 ...
- 【DDD】领域驱动设计实践 —— 限界上下文识别
本文从战略层面街上DDD中关于限界上下文的相关知识,并以ECO系统为例子,介绍如何识别上下文.限界上下文(Bounded Context)定义了每个模型的应用范围,在每个Bounded Context ...
- DDD实战进阶第一波(十五):开发一般业务的大健康行业直销系统(总结篇)
前面我们花了14篇的文章来给大家介绍经典DDD的概念.架构和实践.这篇文章我们来做一个完整的总结,另外生成一个Api接口文档. 一.DDD解决传统的开发的几大问题: 没有描述需求的设计模型:而是直接通 ...
- Python爬虫学习:二、爬虫的初步尝试
我使用的编辑器是IDLE,版本为Python2.7.11,Windows平台. 本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:二.爬虫的初步尝试 1.尝试抓取指定网页 ...
- 用R进行微博分析的初步尝试
新浪微博如火如荼,基于微博的各种应用也层出不穷. 有一种共识似乎是:微博数据蕴含着丰富的信息,加以适当的挖掘.可以实现众多商业应用.恰好社会网络分析也是我之前有所了解并持续学习的一个领域,因此我做了微 ...
- (转) 学习C++ -> 指针初步
学习C++ -> 指针初步 一.指针 1. 什么是指针? 我们知道, 计算机的内存是由一个个独立的存储单元组成, 并且系统会对每一个存储单元分配一个唯一的号码, 称为这个存储 ...
- 学习DDD之路--勇于纠正自己的错误
写这篇文章主要是之前三篇对DDD的介绍算是自己学习的一次试水,也希望能够有更多的人能帮我发现其中的问题.昨天继续阅读了DDD书,发现了自己之前的例子存在了一些问题,早上也和园友进行了一些讨论.最后整理 ...
- 学习 DDD 之消化知识!
接触到DDD到现在已经有8个月份了,目前所维护的项目也是基于DDD的思想开发的,从一开始的无从下手,到现在游刃有余,学到不少东西,但是都是一些关键字和零散的知识,同时我也感受到了是因为我对项目越来越熟 ...
随机推荐
- iOS13暂时关闭黑暗模式+应用内状态栏无法显示问题解决办法
现象: iOS13黑暗模式开启后,app显示会出现很多意外显示情况.暂时屏蔽是最好的选择.当开启黑暗模式,且在项目的target对应的info.plist中添加以下设置时(禁用黑暗模式): <k ...
- 大型情感剧集Selenium:3_元素定位 #华为云·寻找黑马程序员#
关于昨天的文章 今天有朋友反馈,代码运行的时候,selenium提示警告 DeprecationWarning: use options instead of chrome_options drive ...
- 目不识丁的我使用Python编写汉字注音小工具
一万点暴击伤害 人懒起来太可怕了,放了个十一充分激发了我的惰性.然后公众号就这么停了半个月,好惭愧- 新学期儿子的幼儿园上线了APP,每天作业通过app布置后,家长需要陪着孩子学习,并上传视频才算完成 ...
- Python小数据保存,有多少中分类?不妨看看他们的类比与推荐方案...
小数据存储 我们在编写代码的时候,经常会涉及到数据存储的情况,如果是爬虫得到的大数据,我们会选择使用数据库,或者excel存储.但如果只是一些小数据,或者说关联性较强且存在存储后复用的数据,我们该如何 ...
- Unity 3D中C#的性能优化小陷阱
本篇内容主要来自Unity官方手册: 一般性能优化 一些地方为本人瞎编杜撰,请酌情参考.如有错误,欢迎指出. Unity里C#编程虽然既简单还很爽,但是性能小陷阱还不少.我总强迫自己让代码最优,因此很 ...
- linux中RabbitMQ安装教程
linux中RabbitMQ安装教程 在做一个微服务项目时候用到消息队列,于是深入了解了消息队列知识,并在linux上安装了Rabbitmq,本博客介绍Rabbitmq的安装教程,想要深入了解消息队列 ...
- Java修炼——String类_常用方法_常量池
String类的定义:String 是不可变字符序列 String 类的常用方法(全部都是不能改变String本身的值,都是在常量池里输出,没有改变其值) String string="ab ...
- Zookeeper Watcher接口
在ZooKeeper中,接口类Watcher用于表示一个标准的事件处理器,其定义了事件通知相关的逻辑,包含KeeperState和EventType两个枚举类,分别代表了通知状态和事件类型,同时定义了 ...
- 基于leaflet的标绘功能(一)--可调整的圆
标绘功能是指在电子地图上可以标注点.线.面.复杂多边形等图形.主要操作包括上图.调整(大小.方向.位置).网络存储等.根据具体的业务场景,也可以做到协同标绘等特色功能.其中,要求每个图形有若干关键点控 ...
- springboot中实现kafa指定offset消费
kafka消费过程难免会遇到需要重新消费的场景,例如我们消费到kafka数据之后需要进行存库操作,若某一时刻数据库down了,导致kafka消费的数据无法入库,为了弥补数据库down期间的数据损失,有 ...