DDD 实战课
欧创新
人保资深架构师
55517 人已学习
新⼈⾸单¥59
登录后,你可以任选2讲全文学习
课程目录
已完结/共 26 讲
开篇词 (1讲)
DDD 实战课
15
15
1.0x
00:00/00:00
登录|注册

答疑:有关3个典型问题的讲解

事件总线的使用
微服务内聚合之间的领域事件
数据一致性保证
聚合设计的原则
依赖倒置的原因
工厂模式和仓储模式
聚合设计的目的
量化标准的缺失
核心域、通用域和支撑域
子域和限界上下文关系
领域划分过程
问题3:领域事件和数据一致性
问题2:聚合设计和依赖倒置(DIP)
问题1:领域划分和量化标准
答疑:有关三个典型问题的讲解

该思维导图由 AI 生成,仅供参考

你好,我是欧创新。
截至今天这一讲,我们的基础篇和进阶篇的内容就结束了。在这个过程中,我一直有关注大家提的问题。那在实战篇正式开始之前啊,我想针对 3 个比较典型的问题,做一个讲解,希望你也能同步思考,调动自己已学过的内容,这对我们后面实战篇的学习也是有一定帮助的。
问题 1:有关于领域可以划分为核心域、通用域和支撑域,以及子域和限界上下文关系的话题,还有是否有边界划分的量化标准?
我在 [第 02 讲] 中讲到了,在领域不断划分的过程中,领域会被细分为不同的子域,这个过程实际上是将问题范围不断缩小的过程。
借用读者“密码 123456”的总结,他认为:“对于领域问题来说,可以理解为,对一个问题不断地划分,直到划分为我们熟悉的、能够快速处理的小问题。然后再对小问题的处理排列一个优先级。
这个理解是很到位的。在领域细分到一定的范围后,我们就可以对这个子域进行事件风暴,为这个子域划分限界上下文,建立领域模型,然后就可以基于领域模型进行微服务设计了。
虽然 DDD 没有明确说明子域和限界上下文的关系。我个人认为,子域的划分是一种比较粗的领域边界的划分,它不考虑子域内的领域对象、对象之间的关系和结构。子域的划分往往按照业务阶段或者功能模块边界进行粗分,其目的就是为了让你能够在一个相对较小的问题空间内,比较方便地用事件风暴来梳理业务场景。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

领域驱动设计(DDD)是软件开发中的重要方法论,本文围绕三个典型问题展开讲解。首先,对领域划分和限界上下文的关系进行了详细阐述,强调了领域模型的重要性和演进过程。其次,聚合设计中的工厂和仓储模式以及依赖倒置(DIP)的作用得到了解释,强调了解耦应用逻辑和基础资源的重要性。最后,针对领域事件采用消息异步机制的一致性问题和微服务内聚合之间领域事件的使用,提出了解决方案和建议。文章内容深入浅出,为读者提供了宝贵的实践经验和解决问题的思路。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《DDD 实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(28)

  • 最新
  • 精选
  • hunter
    基础层依赖领域层。能录个例子吗?如何反转依赖的,还是不明白

    作者回复: 一个非常简单的例子,有Person聚合根,Person仓储接口和仓储实现。 /** * Person聚合根 */ public class Person{ private String id; private String name; private int age; private boolean gender; } /** * Person仓储接口 */ public interface PersonRepositoryInterface { void save(Person person); void delete(String id); } /** *Person仓储实现 */ @Repository public class PersonRepositoryImp implements PersonRepositoryInterface { private PersonMapper mapper; public void save( Person person) { mapper.create(person); } public void delete((String id) { mapper.delete(id); } } 在应用逻辑中直接用仓储的接口就可以了,数据库相关的逻辑在PersonMapper里面实现。 PersonRepositoryInterface personRepos; personRepos.save(person)

    2019-11-07
    10
    19
  • C J J
    对失血,贫血,充血解释得很不错的文档。https://www.infoq.cn/article/alibaba-freshhema-ddd-practice

    作者回复: 感谢,写的很好。

    2020-01-15
    9
    18
  • 小超人
    “依赖倒置”不看定义我还一直因为是基础层依赖领域层。看了定义才知道,原来是基础层和领域层互相不依赖,而是共同依赖一组抽象接口。我觉得“面向接口编程”听起来更舒服。

    作者回复: 是的。依赖倒置的定义就是面向接口编程,这样不同层之间的服务在实现逻辑发生变化的时候,就不会相互影响了。

    2020-05-29
    3
    12
  • Paul
    老师,您好!有一些设计实现上的疑问: 领域服务的CRUD是不是都是操作聚合根或整个实体对象,比如我只想根据ID判断记录是否存在,或者返回个别字段,需要返回整个实体对象吗?

    作者回复: 其实查询类业务可以不必经过聚合根和仓储。传统方法也可以了。 如果聚合数据比较多,会有延迟加载影响性能。 聚合根的主要目的是为了保证数据的一致性,这些场景一般在CU的场景。

    2019-11-07
    2
    8
  • 南山
    老师,实体内可以调用他所在聚合的仓储吗?

    作者回复: 一般通过聚合根来做。

    2019-11-06
    8
  • 骆驼1089
    老师,有个问题请教一下,充血模式的优势是什么,比现有的贫血模式的优势是什么?

    作者回复: 先只从领域建模的角度来说优势吧。因为DDD是一种面向对象的编程方式,采用充血模型,每个实体就会有自己的业务行为,在领域模型设计时,每一个实体除了自己的属性外,还会有自己的业务行为,而不会将所有的业务逻辑放到业务逻辑层。这样就有利于实体、聚合的解耦。当你需要进行再次拆分的时候,就会很容易。

    2020-04-06
    3
    6
  • Jade
    事件总线 实现思路?用到什么技术或来源组件?还是说事件总线就是消息队列呢

    作者回复: 事件总线就是一个带发布和监听功能的jar包,直接跟你的微服务代码放一起就行了,它属于基础层的代码。提的比较多的是EventBus。你可以去网上找找资料。

    2019-11-06
    6
    4
  • hunter
    微服务内不使用事件总线,如何保证两个聚合操作的一致性?

    作者回复: 这个需要权衡,看看引入事件总线后,这个复杂度可不可以接受。通过应用服务加事务机制应该也可以解决,在同一个进程内的事务应该比跨微服务的事务相对来说还是好控制,对性能影响也会小一些吧。

    2019-11-07
    2
  • 秋雨
    老师你好,我有一个问题想问下: 现有事件风暴再有领域模型还是先划分好领域,再通过事件风暴建立领域模型?

    作者回复: 领域太大的话,建议先划分子域。这是因为领域太大,不好开展事件风暴。在将领域划分成合适大小的子域后,进行事件风暴完成领域建模就比较容易了。

    2020-03-26
    2
    1
  • 小谢同学
    子域划分的过程更偏业务侧工作,然后基于每个子域进行事件风暴(讨论)的时候,就是在梳理领域对象的过程,且发掘领域对象之后就可以分清楚哪些是值对象,哪些是实体哪些是聚合根?是这样理解吗

    作者回复: 是的。

    2020-02-14
    1
收起评论
显示
设置
留言
28
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部