学习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的思想开发的,从一开始的无从下手,到现在游刃有余,学到不少东西,但是都是一些关键字和零散的知识,同时我也感受到了是因为我对项目越来越熟 ...
随机推荐
- 伸展树(Splay tree)的基本操作与应用
伸展树的基本操作与应用 [伸展树的基本操作] 伸展树是二叉查找树的一种改进,与二叉查找树一样,伸展树也具有有序性.即伸展树中的每一个节点 x 都满足:该节点左子树中的每一个元素都小于 x,而其右子树中 ...
- NIO-Channel接口分析
目录 NIO-Channel源码分析 目录 前言 接口 SCTP协议 UDP协议 TCP协议 文件 总结 相关文献 NIO-Channel源码分析 目录 NIO-概览 NIO-Buffer NIO-C ...
- Python爬虫爬取异步加载的数据
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:努力努力再努力 爬取qq音乐歌手数据接口数据 https://y.qq ...
- 【Flutter】348- 写给前端工程师的 Flutter 教程
点击上方"前端自习课"关注,学习起来~ | 导语 最爱折腾的就是前端工程师了,从 jQuery 折腾到 AngularJs,再折腾到 Vue.React.最爱跨屏的也是前端工程师, ...
- 5种JVM垃圾收集器特点和8种JVM内存溢出原因
先来看看5种JVM垃圾收集器特点 一.常见垃圾收集器 现在常见的垃圾收集器有如下几种: 新生代收集器: Serial ParNew Parallel Scavenge 老年代收集器: Serial O ...
- 6种微服务RPC框架,你知道几个?
开源 RPC 框架有哪些呢? 一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的. 跟语言平台绑定的开源 RPC 框架主要有下面几种. Dubbo:国内最早开源的 RPC 框架,由阿里巴 ...
- spf13-vim 显示neocomplete requires ...th Lua support
安装spf13-vim的时候下载了许多插件,neocomplete应该是比较重要的一个,毕竟自动补全.但是在使用时却一直有:neocomplete requires ...th Lua support ...
- 字符串的扩展(ES6)
文章目录 字符串的扩展 1. 字符的Unicode表示法 2. codePointAt() 3. String.fromCodePoint() 4. 字符串的遍历器接口 5. at()(提案) 6. ...
- SpringCloud分布式配置中心
一.什么是配置中心 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring cloud c ...
- Python基础-day01-8
变量的基本使用 程序就是用来处理数据的,而变量就是用来存储数据的 目标 变量定义 变量的类型 变量的命名 01. 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 ...