领域驱动设计统一过程交付物

MetaGPT深度实战指南:从需求到交付物的智能体协作全解析 在AI重构软件工程的今天,如何让大语言模型真正实现软件交付?本文将深入解析MetaGPT其架构设计,并附企业级落地最佳实践。 阅读详情

一、全局分析阶段

1.业务流程

梳理问题空间的业务需求,获得用泳道图表现的业务流程:

2.业务服务

根据业务服务的定义分析业务流程,识别出业务服务,并以业务服务图(参考用例图)形式表示:

说明:如果采用敏捷方式管理需求,可以将业务服务作为用户故事的子任务,它不包括前端的交互设计和开发内容。

如果需要进一步细化业务服务,则需要按照如下格式编写业务服务规约:

编写业务服务规约时,需要遵循统一语言。

以上内容,可以构成目标系统的需求规格说明书。

二、架构映射阶段

1.系统上下文

系统上下文用于呈现目标系统的系统边界,明确目标系统与角色、伴生系统之间的关系。可以通过改进的系统上下文图来表示:

改进的系统上下文有效地利用了四个方位:

  • 上方:代表北向,即调用目标系统的伴生系统或模块
  • 下方:代表南向,即目标系统调用的伴生系统或模块
  • 左方:代表使用目标系统的所有角色
  • 右方:代表互相调用的伴生系统或模块

2.限界上下文

识别限界上下文

运用服务风暴法,识别限界上下文,建立业务服务与限界上下文的映射关系,并以下图形式呈现出来:

图中的菱形代表限界上下文,椭圆形代表业务服务。

确定上下文映射

针对每一个业务服务,通过业务服务规约绘制服务序列图,以确定限界上下文之间的协作关系,并驱动出每个限界上下文的服务契约。绘制服务序列图时,根据业务服务规约“成功场景”部分的流程,确定每个流程步骤需要的领域知识和领域职责应该由哪一个限界上下文负责。服务序列图如下所示:

通过服务序列图,既可以明确限界上下文之间的关系,又可以驱动出每个限界上下文包括伴生系统的服务契约(API),同时还能够确定协作模式,包括客户方-供应方模式和发布者-订阅者模式。其中,查询和命令方式属于客户方-供应方模式,事件方式属于发布者-订阅者模式。服务契约可以通过下表格式表示:

服务契约的API定义也可以在Swagger中维护。

最后,可以通过如下图示表示限界上下文:

与改进的系统上下文图相似,限界上下文图也有效地利用了四个方位:

  • 上方:代表北向服务,为当前限界上下文对外公开的服务接口
  • 下方:代表南向服务,为当前限界上下文调用上游限界上下文或伴生系统的服务接口
  • 左方:当前限界上下文订阅的事件
  • 右方:当前限界上下文发布的事件

限界上下文内部可以呈现属于当前限界上下文领域模型的聚合,如果还未开展领域建模,可以为空。

菱形对称架构

限界上下文的内部应遵循如下图所示的菱形对称架构:

菱形对称架构的核心思想:

  • 内外分离:内部的领域层与外部的网关层分离,保证业务和技术的正交性
  • 南北对称:南向网关采用抽象思想,隔离外部资源变化对内部领域层带来的影响;北向网关采用封装思想,通过定义远程服务和本地服务隔离内部领域逻辑对外部调用者的影响

系统分层架构

在目标系统层面上,需要将各个限界上下文组织在如下图所示的系统分层架构中:

代码模型

遵循菱形对称架构,一个完整的代码模型如下所示:

  • valueaddedlayer

boundedcontext

  • north
  • remote

resource

controller

provider

subscriber

  • local
  • message
  • domain
  • aggregate

entity

valueobject

domainservice

  • south
  • port

repository

client

publisher

  • adapter

repository

client

publisher

以上内容构成了目标系统的架构设计文档。

三、领域建模阶段

1.领域分析建模

领域建模阶段是通过对业务服务规约进行领域分析建模开始的。领域分析建模与具体的建模技术和设计方法没有任何关系,只是从业务的角度通过提取领域概念获得最终的领域分析模型。该方法为快速建模法,得到的模型如下图所示:

图中的灰色领域概念是通过动词建模法获得的。整个领域分析模型需要分配给对应的限界上下文。

2.领域设计建模

静态设计模型

领域设计建模从下图所示的领域分析模型开始:

识别实体和值对象:

确定实体之间的关系:

根据实体关系的强弱划定聚合的边界,获得以聚合为中心的领域设计模型:

动态设计模型

获得动态设计模型的过程如下图所示:

分析业务服务,获得如下所示的业务服务规约:

服务编号:033

服务名:报名活动

服务描述: 

作为报名人

我想要报名活动

以便于预留活动报名资格

触发事件:    

报名人选择自己想要报名的活动,点击“报名”按钮

基本流程:

  • 检查报名人是否有效
  • 检查报名通道是否已关闭
  • 检查该报名人是否已报名
  • 完成报名预约
  • 发送报名预约成功的通知

替换流程:

  • a 若报名人无效,给出提示信息
  • a 如果报名通道已关闭,给出提示信息
  • a 如果已报名,给出提示信息
  • a 如报名失败,给出失败原因

验收标准:   

  • 报名人必须是活动所属部落的会员
  • 报名达到截止日期或者报名人数已到达上限,则视为报名通道已关闭
  • 报名人不能重复报名
  • 完成报名后,报名状态设置为“已预订”
  • 报名人接收到预约成功的通知

根据业务服务规约获得如下所示的任务树:

  • 报名活动
  • 验证报名
  • 验证报名人是否会员 --- 访问部落上下文
  • 确定报名通道是否已关闭
  • 获取报名通道
  • 确定是否已关闭
  • 验证报名单 ---- Repository
  • 生成报名单 --- Repository
  • 更新报名通道
  • 加载报名通道
  • 更新
  • 保存报名通道
  • 发送报名预约成功的通知 --- 通知上下文

分配职责给对应的角色构造型,形成序列图脚本:

TicketController.enrollActivity(EnrollingRequest) {
    TicketAppService.enrollActivity(EnrollingRequest) {
        Ticket ticket = EnrollingRequest.to()
            TicketService.enrollActivity(ticket) {
            TicketService.validate(ticket) {
                MemberClient.isMember(enrollerId, tribeId)
                    EnrollingChannelService.isClosed(activityId) {
                    EnrollingChannel channel = EnrollingChannelRepository.channelOf(activityId)
                        channel.isClosed()
                    }
                TicketRepository.isExists(enrollerId, activityId, TicketStatus)
                }
            TicketRepository.add(ticket)
                EnrollingChannelService.occupiedBy(activityId) {
                EnrollingChannel channel = EnrollingChannelRepository.channelOf(activityId)
                    channel.occupiedWith(1)
                    EnrollingChannelRepository.save(channel)
                }
        }
        ActivitySubscribedPublisher.publish(ActivitySubscribed)
        }
}

领域建模阶段输出的静态领域设计模型与动态领域设计模型共同组成限界上下文的设计文档。

领域驱动设计(DDD)之事件风暴电商项目实战 ** 领域驱动设计(DDD)之事件风暴电商项目实战 ** 最近公司里立项了一个类似于SAAS市场的电商的项目,在我的一再推荐下最终决定尝试采用DDD的思想进行设计。下面记录了我们建模过程中的关键步骤结果(警告:!!即便我已看过大量文章做过好几次实战设计,也时常在此次设计过程中感觉到对事件风暴部分步骤束手无策,怎么做都感觉不对劲,比如:如何正确识别领域事件。所以一切还请已看官您的理解为准,也还有留言交流!!) **项目需求简述:**类似于常见的电商项目,有注册登录、商品上下架、下单购买。不同的是该项目没有物流 阅读详情

相关推荐

分布式架构原理与实践+解构领域驱动设计

为了完成上面的订单业务流程,将分布式系统分为了四层。客户端:这是用户与系统之间的接口。了提升用户体验,会利用 HTTP 缓存手段将部分静态资源缓存下来,同时也可以将这部分静态资源缓存到 CDN 中,因为 CDN 服务器通常会让用户从比较近的网络节点获取静态数据。负载均衡器(以下称接入层):负载均衡器可以通过用户 IP 将用户的请求路由到不同的服务器集群。另外,在负载均衡这一层,还可以进行流量控制和身份验证等操作。

modouwu的博客 465

一、领域驱动设计核心思想与设计过程

领域驱动设计核心思想与场景设计过程

w1234567465的博客 1049

一文带你初识DDD领域驱动设计

然而,领域驱动设计,是什么?很多书籍,很多博客,都没有对领域驱动设计下一个标准的定义。 就连《实现领域驱动设计》这一本书,也没有对领域驱动设计下了标准化的定义,而是反复描述DDD能解决些什么、应该怎么样做才是DDD。 因为,DDD是一种方法论,是一种指导思想,从不同的视角去看DDD结果是不一样的,因此,不适合对DDD做标准化定义,也无法对DDD做标准化定义。 如果你执着于给DDD下一个定义,那么,就是陷入到思维的囚笼中无法逃脱。

知而有涯,学而无涯 1051

第三章 领域驱动设计统一过程

领域驱动设计具有一定的开放性,只要遵循"以领域驱动为核心"的原则,就可以在软件构建过程中使用不限于领域驱动设计提出的方法,以控制软件的复杂度。在不违背核心原则的情况,我们可以按照对它的理解,结合自身在项目中的实践来扩展整套方法论,这意味的我们自己也可以添加新的模式。

weixin_48540423的博客 1044

SLAM算法的优缺点

SLAM(Simultaneous Localization and Mapping,同时定位与地图构建)算法是一种通过传感器数据实时估计机器人自身位置和构建环境地图的技术。

selenia8860的博客 2908

分布式光纤传感(DFOS)DTS/DAS/DSS 三合一:10公里管线监测实战与数据解读

本文详细介绍了分布式光纤传感(DFOS)技术在10公里管线监测中的实战应用,通过DTS(温度)、DAS(振动)、DSS(应变)三合一系统,实现对管线健康状态的立体感知。文章涵盖工程部署、数据采集、多物理量数据融合及噪声抑制等关键技术,展示了如何通过一根光纤完成复杂监测任务,显著提升管线安全性和维护效率。

weixin_29168153的博客 316

交付驱动方法的情况(软工系列文章之四)

交付驱动方法的情况,A Case for a "Deliverables Driven" Approach  By Russ Finney(来自软件工程论坛 seforum.yeah.net) (翻译yanrj )   很多系统建造者认为交付证实的项目完全是一种费时的活动。他们给出持这种看法的原因:   *为什么建造出来的东西最终会改变并变得过时?   *编制正规文档将占用真正任务所用的时间:

讲武堂-Jiangtao 2810

将运算放大器(运放)用作比较器

我们研究了一些经典的运算放大器电路。这些电路中运用了负反馈,因此通常就可以使运算放大器工作在线性区域内。 但是,也可以将运算放大器用作比较器,从而使其以非线性方式工作。由于其输入受到硬驱动,因此其输出电压会对电源轨产生猛烈的冲击。如下文所示,这可能并不总是一种好的设计方法。 变为非线性 在线性应用中,可以对运算放大器做如下理想假设:无限增益和带宽、零输出阻抗、无限输入阻抗,以及输入之间为零伏。也可以将运算放大器以非线性方式使用,但有一些地方要特别注意和处理。 一种常见的配置是仅使用开环运算放大器(无反馈),

ltqdxl的博客 3万+

DDD(领域驱动设计)系列主题:领域驱动设计(DDD)实践

过去几年,通天塔一直处于快速的业务能力建设和架构完善的阶段,以应对不断增长的业务需求和容量、高可用等技术需求,现在通天塔平台已经能满足集团主站的大部分活动、频道搭建和运营能力,主流程的新需求越来越少,个性化需求和非标准化流程的数据源和服务接入的需求越来越多,有些甚至是京东零售体系外的,同时通天塔技术和产品也在积极主动寻求变化和创新,这些因素结合在一起驱动通天塔孵化出了一个以技术为导向的项目:通天塔积木,旨在构建一个基于完全开放的前端 SDK 和后端数据源&服务、高度灵活和强大的积木画布、能够快速移植

Larry的博客 1285

Keil MDK安装NRF52832开发环境全攻略(附系统时间错误解决方案)

本文详细介绍了如何使用Keil MDK搭建NRF52832开发环境,包括基础软件安装、项目配置关键步骤以及常见问题解决方案。特别针对系统时间错误导致的编译失败问题提供了实用解决方法,帮助开发者快速上手NRF52832开发。

weixin_29168153的博客 506

OpenClaw人人养虾:接入Matrix

Matrix 是一个开放的去中心化通讯协议(Decentralized Communication Protocol),任何人都可以搭建自己的 Homeserver(家服务器)并与全球 Matrix 网络互联。OpenClaw 通过 Matrix Client-Server API 实现接入。

王国平的博客 528

DDD领域驱动设计理论|得物技术

领域驱动设计简称“DDD”,一套“知易行难”的方法论。同时我所工作的这些年,尤其在某大厂做初创项目的那段时间,经常会产生各式各样的“思想碰撞”,特别在设计中台基建类领域时,为了保证充足的扩展性和稳定性,都要好好的“碰撞”一下。

SmartCodeTech的博客 1万+

vue3 - 详细实现用户收货地址识别解析“姓名/手机号/省市区/街道/乡镇村庄“关键字,用户复制粘贴一段含有姓名电话/详细地址的文字文本信息,vue3自动识别拆分并填入到对应表单字段中,详细示例代码

vue3,nuxt3,快递地址读取,收货地址解析、快递地址解析、物流地址解析自动识别,收货地址解析,从发货地址中拆出姓名电话地址,根据粘贴的字符串提取姓名地址,vue3地址信息自动识别,ts,vue3智能识别地址,提取姓名电话地址信息,自动识别出省市区街道姓名手机号等,根据文本自动解析出收货信息,怎么识别文本中的手机号,粘贴板地址识别,地址智能识别,如何识别收货地址中的关键字,粘贴一段文字后,自动识别到姓名/手机号/收货地址,vue3仿淘宝地址智能识别解析实现,省市区街道智能解析,vue3收货地址,识别地址

✅ 精选推荐文章 5504

《解构领域驱动设计》读书笔记

复杂系统:由大量互相作用的部分组成的系统。这些组成部分相对简单,没有中央控制,组成部分之间也没有全局性的通信,并且组成部分的相互作用导致了复杂行为。影响阻碍理解能力的要素:影响阻碍预测能力的要素:软件系统的构建实则是对问题空间的求解,以获得构成解空间的设计方案。子领域、限界上下文、分层架构和聚合皆为领域驱动设计的核心元模型,分属战略设计和战术设计,贯穿了从问题空间到解空间的全过程。领域驱动设计(DDD)需要应对软件复杂度的挑战:领域驱动设计的开放性是其生命长青的基石,但

生活在别处 2193

ANSYS——“There is at least 1 small equation solver pivot term”问题的解决办法

ANSYS——“There is at least 1 small equation solver pivot term”问题的解决办法

python_AI_fans的博客 1万+

Q3D提取PCB走线RLCG参数

介绍一种提取PCB走线寄生电容和寄生电感的方法

sinat_15150363的博客 2928

领域驱动设计现存的不足(福利赠书)

只凭经验,我们得经过遥遥辽远的汗漫之游,才能得到便利直捷之径。——洛节·爱铿,转引自托马斯·哈代的《德伯家的苔丝》距离领域驱动设计的提出已有十余年,开发人员面对的软件开发模式、开发技术和I...

u013527895的博客 504

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

一文详谈领域驱动设计实践

本文作者结合在团队的实践过程,分享了自己对领域驱动设计的一些思考。了解过领域驱动设计的同学都知道,人们常常把领域驱动设计分为两部分:战术设计和战略设计。这两个概念本身都是抽象的,有人把战术设计看作是领域内的设计过程,而战略设计看作是领域间关系的设计过程。也有一种认知是把战术设计看作是编码的设计,把战略设计看作是架构的设计。实际上领域驱动设计的作者Eric Evans本无意将这两者进行割裂,相反两者之间相辅相成,缺一不可。我将在本文中结合团队的实践过程,分享我对领域驱动设计的一些思考。

m0_46163918的博客 983

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

DDD专家张逸:构建领域驱动设计知识体系

张逸读完需要5分钟速读仅需 2 分钟领域驱动设计专家,曾就职于 ThoughtWorks,作为 Lead Consultant 为客户提供架构设计、大数据分析、持续交付、代码质量、敏捷管...

中生代技术 2747

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

DDD - 如何设计支持快速交付的DDD技术中台

以往建设的系统都分为前台和后台,前台就是与用户交互的UI界面,后台就是服务端完成的业务逻辑操作。然而,在我们以往开发的很多业务系统中,有一些内容是共用的部分,在未来开发的业务系统中也要使用。因此,如果能把这些内容提取出来做成公用组件,那么在未来,开发系统就简单了,不用每次都重头开发,复用这些组件就可以了。但是,这些公用的组件到底属于前台还是后台呢?都不属于。它既包含前台的界面,也包含后台的逻辑,因此被称为“中台”。

小工匠 3498

浅谈如何理解领域驱动设计

本文作者为长沙.NET社区开发者微笑刺客,转载已获得作者授权。前言什么是领域,我习惯描述的是制药领域、环境领域、建筑领域、金融领域等,而在领域内,各种业务规则、业务知识盛行,如何有效的把...

farway000的博客 938

一文浅谈DDD领域驱动设计

目前在公司看到过的大部分代码中都有两种类型:服务类(Service Object)和数据类(Data Object);所有的数据对象,被开放了所有的Getter和Setter方法,再有lombok等语法糖的加入,对象的封装变得更加困难了。而所有的业务逻辑都被堆在了各种Service中,好的团队会对这些Service类做很好的分层设计,这种开发方式能够在程序员中被广泛认可,其优势不言而喻,它能够让一个只要掌握编程语言的新手,快速的承接需求并交付,无需在代码设计和怎么写的问题上花费更多的精力和学习成本。

simon的博客 1709

【领域驱动设计(1)】领域驱动设计:在复杂业务中,为“人”而写的软件艺术

领域驱动设计:在复杂业务中,为“人”而写的软件艺术

hiliang521的博客 855

浅析DDD(领域驱动设计)

最近在做一些微服务相关的设计,内容包括服务的划分,Restful API的设计等。其中比较棘手的就是Service的职责划分:如何抽象具有统一业务范畴的Model,使其模块化,又如何高度提炼并组合多模块,使得业务可独立服务化。为了找寻答案,看了不少书籍和博客,在DDD中找到了一些思路,个人觉得受益匪浅,或许也可以受用于大家,特分享于此。 什么是DDD软件开发不是一蹴而就的事情,我们不可能在不了解产品

追 1万+
上一篇: MySQL 死锁了,怎么办?
下一篇: 三张图带你彻底理解 RocketMQ 事务消息
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值