学习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的思想开发的,从一开始的无从下手,到现在游刃有余,学到不少东西,但是都是一些关键字和零散的知识,同时我也感受到了是因为我对项目越来越熟 ...
随机推荐
- apache thrift 和 apache jersey 记录
几篇好的入门文档链接: 1. Hello World by Thrift Using Java 2. Thrift 实例 Helloworld 3. Thrift版的Hello World 4. Th ...
- javascript数据类型和类型转换
一 数据类型 1)typeof 查看数据类型 1.number 数字 取值范围:正无穷 - 负无穷.NaN 正无穷:Number.POSITIVE_INFINITY 负无穷:Number.NEGAT ...
- Solr单机配置详解
Solr 单机版安装 安装环境 安装 jdk:JDK 版本: jdk-8u11-linux-x64.tar.gz 环境变量配置; export JAVA_HOME=/usr/local/jdk exp ...
- CF 1132A,1132B,1132C,1132D,1132E,1132F(Round 61 A,B,C,D,E,F)题解
A.Regular bracket sequence A string is called bracket sequence if it does not contain any characters ...
- 洛谷 题解 P5015 【标题统计】 NOIP2018 普及组 T1
没有人用 scanf("%c", &ch) != EOF 吗? scanf 和 EOF 会伤心的. 思路:逐个读入字符,遇到EOF中止,对于每个读入的字符进行判断. 附上考 ...
- Python基础第二课
字符串(引号):四种表达方式 n1 = "我是" n1 = '我是' n1 = """我是""" n1 = '" ...
- Linux中sed基础
sed是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern spac ...
- 如何正确的使用Python解释器?你之前肯定用错了
作为python开发者,当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件.要运行代码,就需要Python解释器去执行.py文件.由于整个Python语言从 ...
- 如何用css画一个文件上传图案?
如下图,如果是你,你会怎么实现: 通常我们会通过字体图标来显示中间的加号,外层用一个div包裹即可:或者使用伪元素来模拟中间的一横一竖,这都比较麻烦. 其实我们可以直接使用div+css就可以实现. ...
- JS基础知识点——原始类型和对象类型的区别
1.js类型 1.1 JavaScript语言规定了7种语言类型,他们分别是: Number(数字) Boolean(布尔值) String(字符串) Null (空) Undefined (未定义) ...