当前位置: 首页 > 科技观察

Domain-DrivenDesignUnifiedProcessDeliverables

时间:2023-03-12 04:50:06 科技观察

1.全局分析阶段1.业务流程梳理问题空间的业务需求,得到泳道图表示的业务流程:2.业务服务根据分析业务流程定义业务服务,识别业务服务,以业务服务图(参考用例图)的形式表示:注:如果采用敏捷管理来管理需求,业务服务可以作为用户故事的子任务,即不包括前端交互设计和开发。如果需要进一步细化业务服务,则需要按照以下格式编写业务服务规范:编写业务服务规范时,需要遵循统一的语言。以上内容即可构成目标系统的需求说明书。2.架构映射阶段1.系统上下文系统上下文用于呈现目标系统的系统边界,并明确目标系统、角色和伴随系统之间的关系。可以用一个改进的系统上下文图来表示:改进后的系统上下文有效地利用了四个方向:上图:表示北方向,即调用目标系统的伴生系统或模块。下方:代表南向,即目标系统调用的伴生系统或模块左侧:代表使用目标系统的所有角色。右侧:代表相互调用的关联系统或模块图形化呈现:图中菱形代表限界上下文,椭圆代表业务服务。确定上下文映射针对每一个业务服务,通过业务服务规范绘制服务时序图,确定限界上下文之间的协作关系,驱动出每一个限界上下文的服务契约。在绘制服务时序图时,根据业务服务规范“成功场景”部分的流程,确定哪个限界上下文负责每个流程步骤所需的领域知识和领域职责。服务时序图如下:通过服务时序图,可以理清限界上下文之间的关系,可以驱动出各个限界上下文,包括伴生系统的服务契约(API),协作模式可以也被确定,包括客户端。-供应方模式和发布者-订阅者模式。其中,query和command模式属于client-supplier模式,event模式属于publisher-subscriber模式。服务契约可以用下表的形式表示:服务契约的API定义也可以在Swagger中维护。最后,限界上下文可以用下图表示:与改进后的系统上下文图类似,限界上下文图也有效地利用了四个方向:top:代表北向服务,是当前限界上下文暴露的服务接口。Bottom:代表向南的服务,为当前的BoundedContext调用上游BoundedContext或者伴生系统的服务接口Left:当前BoundedContext订阅的事件Right:当前BoundedContext发布的事件BoundedContext里面可以present聚合属于当前限界上下文的领域模型,如果领域建模还没有进行,可以为空。菱形对称架构boundingcontext内部应该遵循菱形对称架构如下图所示:菱形对称架构的核心思想:内外分离:内部领域层与领域层分离外部网关层,保证业务正交和技??术南北对称:南向网关采用抽象的思想,隔离外部资源变化对内部领域层的影响;北向网关采用封装的思想,通过定义远程服务和本地服务,隔离内部领域逻辑对外部调用者的影响。系统分层架构在目标系统层面,需要在系统分层架构中组织各个限界上下文,如下图所示:代码模型遵循菱形对称架构,一个完整的代码模型如下如下:valueaddedlayerboundedcontextnorthremoteresourcecontrollerprovidersubscriberlocalmessagedomainaggregateentityvalueobjectdomainservicessouthportrepositoryclientpublisheradapterrepositoryclientpublisher以上内容构成了目标系统的架构设计文档。三、域建模阶段1.域分析和建模域建模阶段从业务服务规范的域分析和建模开始。领域分析建模与具体的建模技术和设计方法无关,只是从业务角度提取领域概念,得到最终的领域分析模型。该方法是一种快速建模方法,得到的模型如下图所示:图中的灰色域概念是通过动词建模方法得到的。整个领域分析模型需要分配给对应的限界上下文。2.领域设计建模静态设计模型领域设计建模从下图领域分析模型开始:识别实体和值对象:确定实体之间的关系:根据实体关系的强弱划定聚合边界,得到以聚合为中心的领域设计模型:动态设计模型获取动态设计模型的过程如下图所示:分析业务服务,得到如下业务服务规范:服务编号:033服务名称:注册活动服务描述:asa报名我要报名参加活动预约活动报名资格触发事件:报名者选择自己要报名的活动,点击“报名”按钮。基本流程:查询申请人是否有效查询报名通道是否关闭查询申请人是否有效已报名并预约发送报名预约成功通知更换流程:a如果申请人无效,给予提醒a报名通道关闭,提示a如果已经报名,提示a报名失败,提示失败原因受理标准:报名者必须是活动所属部落的成员.如报名截止时间已到或报名人数已达上限,报名通道将被视为关闭。申请人不能重新注册。申请者收到预约成功的通知。根据业务服务协议,得到如下任务树:注册活动验证注册验证申请者是否为会员---访问战队上下文,判断注册通道是否关闭获取注册通道,判断是否有验证报告isclosedList---Repository生成注册表单---Repository更新注册通道加载注册通道更新并保存注册通道发送注册预约成功的通知---通知上下文将职责分配给相应的角色构造型到形成时序图脚本:TicketController。enrollActivity(EnrollingRequest){TicketAppService.enrollActivity(EnrollingRequest){Ticketticket=EnrollingRequest.to()TicketService.enrollActivity(ticket){TicketService.validate(ticket){MemberClient.isMember(enrollerId,tribeId)EnrollingChannelact(Service.isd){EnrollingChannel通道=EnrollingChannelRepository.channelOf(activityId)channel.isClosed()}TicketRepository.isExists(enrollerId,activityId,TicketStatus)}TicketRepository.add(ticket)EnrollingChannelService.occupiedBy(activityId){EnrollingChannel通道=EnrollingChannelRepository.channelOf(activityId))channel.occupiedWith(1)EnrollingChannelRepository.save(channel)}}ActivitySubscribedPublisher.publish(ActivitySubscribed)}}领域建模阶段输出的静态领域设计模型和动态领域设计模型共同构成了限界上下文的设计文档