ddd领域驱动设计精要

倒骑的驴 倒骑的驴     2022-09-18     561

关键词:

 

本文算是《领域驱动设计》这本书的读书笔记,加上自己的一些读后感。网上有很多这本书的读书笔记,但是都是别人的,不如自己总结的理解深刻。建议大家在读这本书时结合《实现领域驱动设计》一起看,同时,一定要去实际建模和编码,理论联系实际才能得其精髓。

本文是【DDD】系列文章的第一篇,可参考:使用领域驱动设计思想实现业务系统

定义

DDD是Domain driven design(领域驱动设计)的简称,是一种软件设计和开发的方法论,特别适用于复杂业务领域软件设计和开发。可参考wiki: Domain-driven_design

核心

  1. 将所有业务逻辑内聚到业务领域(domain)层,将设计和开发的关注点聚焦到业务领域;
  2. 建立通用的‘业务领域语言(Ubiquitous Language)’,Ubiquitous Language是工程师和业务领域专家(可以是产品经理、运营、业务相关人员)的桥梁;
  3. 战略上,通‘上下文(Bounded Context)’解耦各个业务系统/组件,通过‘防腐层(Anticorruption layer)’确保自有业务领域不受外界污染,通过‘开放主机服务(Open Host Service)’向外界公开服务;
  4. 战术上,将业务对象建模为entity和value object,entity有唯一业务标识且在其生命周期中状态可变,value object与之相反;关联性强的entity和value object聚合成一个Aggregate,每个Aggregate有一个root entity,确保Aggregate内容业务规则和行为的一致性;业务行为尽量建模在entity/ value object 上,当业务行为无法建模到任何业务entity/value object时,可以使用领域服务(domain service),使用factory创建复杂的业务entity,使用repository实现实体的重建和持久化操作;领域相关的通知等可以通过domain event发布出去。

概念

  • Bounded context:边界上下文

划分领域边界,边界内领域模型保持一致,强调内聚,并与边界外的领域模型解耦。

  • Entity:领域实体

有唯一标识,可变的业务实体对象,它有着自己的生命周期。比如User、帖子等。

  • Value Object:领域值对象

没有唯一业务标识,通常依附于其他领域实体,值对象的内容不可变,要么被整体替换。如:用户点赞行为等。

  • Aggregate:聚合

是一组业务关联度很强的实体/值对象集合,每个聚合都有一个根实体(Root Entity),通过根实体可以路由到整个聚合。

  • Domain Event:领域事件

领域中发生的异步处理事件、异步消息通知等,比如:异步写入的登录历史记录。通常借助消息队列实现。

  • Domain Service:领域服务

当某些业务行为无法归类到某一个Entity/Value Object时,我们便可以创建领域服务来完成。比如:账户转账场景,涉及到两个不同的Account实体,再比如社区的敏感词过滤场景,帖子可以用,评论亦可以用,因此可以抽离到ContentFilter中完成。

  • Repository:仓库

严格意义上将仓库是基础设施层的东西,但是为了保持领域模型的整体性,我们将仓库的接口定义放到领域中,这样可以在领域中约束实体/值对象的增删改查接口,同时还可以方便地完成仓库的内存形式实现,使得领域模型弱依赖于持久化层。这一点在书中被成为‘依赖倒置’(参考《实现领域驱动设计》P372)。

  • Factory:领域对象工厂

用于复杂领域对象的创建/重建。重建是指通过respostory加载持久化对象后,重建领域对象。

图解

分层图

User Interface —— 用户界面层。提供与用户/调用者交互的接口,可以是View,也可以是Restful api,还可以是二进制形式的tcp协议接口等。

Application —— 应用服务层。组合domain和infrastructure,完成具体的业务逻辑。

Domain —— 业务领域层。是ddd中的核心层,内聚所有的业务逻辑,保持领域的一致性。通常他可能会用到infrastructure层的公共组件。

Infrastructure —— 基础设施层。提供公共服务组件,比如validation、登录态校验、trace日志记录等等。

 

模式图

这张图囊括了DDD中的所有核心概念,上面部分是战术相关,下面部分是战略相关。不再赘述,建议读者直接查阅DDD原书,有详细介绍。值得反复细读。

思考

  • DDD vs MVC 异同之处?
  • DDD vs CRUD 的区别是什么? 可参考:http://jlhood.com/there-is-no-u-in-crud/
  • DDD 能带来什么好处?有什么不好的地方?
  • DDD 适用的场景?
  • 你为什么选择使用DDD?

在评论区,附上自己的思考,会不间断更新。欢迎大家写上你们的理解。

领域驱动设计实战-ddd

领域驱动设计实战领域驱动(DDD,DomainDrivenDesign)为软件设计提供了一套完整的理论指导和落地实践,通过战略设计和战术设计,将技术实现与业务逻辑分离,来应对复杂的软件系统。本系列文章准备以实战的角度来介绍DDD,首... 查看详情

ddd领域驱动设计基本理论知识总结

 原文:DDD领域驱动设计基本理论知识总结 领域驱动设计之领域模型加一个导航,关于如何设计聚合的详细思考,见这篇文章。2004年EricEvans发表Domain-DrivenDesign–TacklingComplexityintheHeartofSoftware(领域驱动设计),简称EvansDDD... 查看详情

领域驱动设计(ddd)

领域驱动设计在互联网业务开发中的实践领域驱动设计,根本目的在于,系统的高内聚低耦合。通过拆分具体需求,生成核心上下文,各个支撑上下文,上下文之间低耦合。  查看详情

领域驱动设计(ddd)实践之路:如何设计聚合

...:https://mp.weixin.qq.com/s/oAD25H0UKH4zujxFDRXu9Q作者:wenbozhang【领域驱动设计实践之路】往期精彩文章:《领域驱动设计(DDD)实践之路(一)》主要讲述了战略层面的DDD原则《领域驱动设计(DDD)实践之路(二):事件驱动与CQRS》分析了如何应... 查看详情

ddd领域驱动设计-ddd概览

参考技术A#DDD概览##启迪领域可以理解为业务,领域专家就是对业务很了解的人。限界上下文也就是微服务的边界,也可以理解为微服务,一个限界上下文=一个微服务。个人理解领域驱动设计就是微服务驱动设计,从战略上先进... 查看详情

浅谈我对ddd领域驱动设计的理解

目录从遇到问题开始DDD切入点1-理解概念什么是领域(Domain)?什么是设计(Design)?什么是驱动(Driven)?概念总结:DDD切入点2-理解领域、拆分领域、细化领域理解领域知识是基础拆分领域细化子域DDD切入点3-领域模型设计领... 查看详情

ddd领域驱动设计(代码片段)

有幸参与了一些领域驱动的项目,读了一些文章,也见识了一些不伦不类的架构,感觉对领域驱动有了更进一步的认识。所以今天跟大伙探讨一下领域驱动设计,同时也对一些想要实践领域驱动设计却又无处下手,或者一些正在... 查看详情

领域模型驱动设计(ddd)之模型提炼

...所深深困扰而无暇顾及软件的真正核心业务建模其实业务领域建模同样是一个比平台架构更复杂更需要学习的新的领域  相反在实践中我们技术人员在经过冗长的平台架构学习和实践后就匆忙开始项目开发这时是什么指导他们... 查看详情

领域驱动设计(ddd)中简单易用的10种技巧

领域驱动设计(DDD),因非常适合与微服务进行配合而闻名,因《领域驱动设计》那本书的难懂而让人望而却步。其实《领域驱动设计》这本书讲的是:以领域为核心,在代码中体现领域的思想,开发人员和领域专家要紧密沟通。... 查看详情

ddd(领域驱动设计)

模型驱动设计(DomainDrivenDesign)模型关系图(Model-DrivenDesign)领域驱动设计中的模型关系图如下:层结构(LayeredArchitecture)UserInterface负责向用户展现信息,并且会解析用户行为,即常说的展现层。ApplicationLayer应用层没有任何的业务逻辑... 查看详情

什么是领域驱动设计 (DDD)? [关闭]

】什么是领域驱动设计(DDD)?[关闭]【英文标题】:WhatisDomainDrivenDesign(DDD)?[closed]【发布时间】:2010-11-1609:10:07【问题描述】:我不断看到DDD(域驱动设计)在文章中被大量使用-我已经阅读了有关DDD的Wikipedia条目,但仍然无法弄... 查看详情

ddd领域驱动设计落地实践系列:初识ddd

引言笔者在经历的很多项目中都使用了DDD领域驱动设计进行架构设计,尤其是在业务梳理、中台规划以及微服务划分等方面,DDD是重要的架构设计方法论,对平时的架构设计有非常好的指导作用。从本文开始笔者将通... 查看详情

什么是ddd(领域驱动设计)?

领域驱动设计的基本概念领域驱动设计作为一个针对大型复杂业务系统的领域建模方法体系(不仅限于面向对象的领域建模),它改变了传统软件开发工程师针对数据库建模的方式,通过面向领域的思维方式,... 查看详情

谈谈ddd(领域驱动设计)(代码片段)

...组织了小红花的新一期分享快速搞定数字化项目——采用领域驱动设计(DDD)建设一个电商平台,听完池总的这个分享之后,我终于是把这两年重新热起来DDD(以下称为现代DDD)和我十几年前熟悉的DDD(以下称为... 查看详情

ddd领域驱动设计实践——domain层实现

...valueobject、domainevent、domainservice的职责,以及如何识别出领域中的这些对象,并附有具体的业务建模示例。相比于《领域驱动设计》原书中的航运系统例子,社交服务系统的业务场景对于大家更加熟悉,相信更好理解。本文是【D... 查看详情

ddd领域驱动开发

文章目录DDD(DomainDrivingDesign)领域驱动开发1、微服务设计为什么选择DDD1、架构对比2、微服务的问题3、战略设计(业务层面-业务架构)4、战术设计(技术层面-系统架构):5、DDD和微服务2、领域、子... 查看详情

ddd领域驱动开发

文章目录DDD(DomainDrivingDesign)领域驱动开发1、微服务设计为什么选择DDD1、架构对比2、微服务的问题3、战略设计(业务层面-业务架构)4、战术设计(技术层面-系统架构):5、DDD和微服务2、领域、子... 查看详情

ddd领域驱动设计-设计文档模板

...板:系统背景和定位需求描述系统用例图关键业务流程图领域语言整理,主要是整理领域中的各种术语的定义,名词解释领域划分(分析出子域、核心域、支撑域)每个子域的领域模型设计(实体、值对象、聚合、领域事件,需... 查看详情