答疑:有关3个典型问题的讲解
答疑:有关3个典型问题的讲解
讲述:欧创新
时长11:03大小7.60M
赞 33
提建议
精选留言(28)
- 吃饭饭2019-11-06事件风暴?为什么一有关键词总会出现这个,它不就是一个集中讨论定需求的动作?陌生词汇太多,如果夹杂一些白话最好了,感觉这一套字眼真的是越说越迷糊了,DDD 我感觉说白了就是一种划分手段,核心最终都会落在为服务上共 7 条评论43
- 张迪2019-11-07基础层依赖领域层。能录个例子吗?如何反转依赖的,还是不明白
作者回复: 一个非常简单的例子,有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)
共 9 条评论19 - C J J2020-01-15对失血,贫血,充血解释得很不错的文档。https://www.infoq.cn/article/alibaba-freshhema-ddd-practice
作者回复: 感谢,写的很好。
共 8 条评论14 - 小超人2020-05-29“依赖倒置”不看定义我还一直因为是基础层依赖领域层。看了定义才知道,原来是基础层和领域层互相不依赖,而是共同依赖一组抽象接口。我觉得“面向接口编程”听起来更舒服。
作者回复: 是的。依赖倒置的定义就是面向接口编程,这样不同层之间的服务在实现逻辑发生变化的时候,就不会相互影响了。
共 3 条评论11 - 南山2019-11-06老师,实体内可以调用他所在聚合的仓储吗?
作者回复: 一般通过聚合根来做。
8 - Paul2019-11-07老师,您好!有一些设计实现上的疑问: 领域服务的CRUD是不是都是操作聚合根或整个实体对象,比如我只想根据ID判断记录是否存在,或者返回个别字段,需要返回整个实体对象吗?
作者回复: 其实查询类业务可以不必经过聚合根和仓储。传统方法也可以了。 如果聚合数据比较多,会有延迟加载影响性能。 聚合根的主要目的是为了保证数据的一致性,这些场景一般在CU的场景。
共 2 条评论7 - 骆驼10892020-04-06老师,有个问题请教一下,充血模式的优势是什么,比现有的贫血模式的优势是什么?
作者回复: 先只从领域建模的角度来说优势吧。因为DDD是一种面向对象的编程方式,采用充血模型,每个实体就会有自己的业务行为,在领域模型设计时,每一个实体除了自己的属性外,还会有自己的业务行为,而不会将所有的业务逻辑放到业务逻辑层。这样就有利于实体、聚合的解耦。当你需要进行再次拆分的时候,就会很容易。
共 3 条评论6 - Jade2019-11-06事件总线 实现思路?用到什么技术或来源组件?还是说事件总线就是消息队列呢
作者回复: 事件总线就是一个带发布和监听功能的jar包,直接跟你的微服务代码放一起就行了,它属于基础层的代码。提的比较多的是EventBus。你可以去网上找找资料。
共 6 条评论4 - 密码1234562019-11-06感觉有点像,设计模式中核心的一句话。封装变化。变化是无穷的,但是我们尽可能的把,变化引起的改动降到最小。4
- 祥敏2019-11-06您好,领域层提供仓储接口,基础层实现仓储接口,依赖倒置的设计是非常好的,能够拆除领域层对基础层的依赖。 上层向下依赖领域层,领域层通过依赖倒置,让基础层也依赖领域层,这样就实现了领域层为核心的设计理念。 领域驱动设计提出了全新的设计思路,讲述偏抽象,重点在如何落地,期待实战篇。共 3 条评论3
- 夙梦流尘2019-11-21有个问题想请教下。现在A聚合里面有B、C实体,是通过A的主键去关联的(我知道这样不好但是目前老项目就是这么搞的,重新定义实体标识风险有点大)。导致现在我用工厂创建A聚合的话,要先把A的数据落地,才能拿到A的主键,然后才能创建A聚合里的BC实体。这样的话只能 1.在工厂里就把A落地,然后填充BC实体返回完整聚合。2. 工厂只返回A聚合,然后在填充BC实体。这样工厂就没返回一个完整聚合。 这两种我觉得都不好,麻烦指导下展开
作者回复: A的主键是由数据库的序列号生成的吗? 如果是这样,在A的方法里面增加一个生成主键的方法呢。这样就可以在形成PO前,拿到所有实体的数据了。
共 2 条评论1 - 瓜瓜2019-11-07使用充血模型,比如RPC的接口包,接口包的实体为充血模型,该实体的很多功能需要引用很多第三方jar包,这样会不会导致接口包很沉重,比如说一个图片上传服务,客户端和服务端交互是通过图片实体来进行交互的,而图片的下载和上传是属于图片实体的内部功能,这样图片实体就会引用apahce.httpclient的很多jar包,该怎样解决这个问题呢
作者回复: 你这种方式可能就不适合充血模型了。 DDD用充血模型的主要目的是为了在领域模型中体现实体的业务行为,而不是所有实体的行为混杂在一起。但是这只是一个建议的设计原则,贫血模型有时候也是不可避免的。
共 5 条评论1 - 张迪2019-11-07微服务内不使用事件总线,如何保证两个聚合操作的一致性?
作者回复: 这个需要权衡,看看引入事件总线后,这个复杂度可不可以接受。通过应用服务加事务机制应该也可以解决,在同一个进程内的事务应该比跨微服务的事务相对来说还是好控制,对性能影响也会小一些吧。
2 - Geek88152021-07-10欧老师,倒数第三段的这句话”不会出现导致聚合之间数据不一致的情况,就可以不使用事件总线“能不能再解释下,我理解是“不会出现导致聚合之间数据不一致的情况,就可以使用事件总线“
- Hans2020-07-29聚合之间如果存在聚合根吗,如果业务交互只需要属性值,是否可以直接返回属性值。
作者回复: 不好意思啊,没明白您问的问题。 你是不是想说聚合之间通过聚合根ID来访问得返回对象。聚合之间的访问一般放在应用层,在应用服务中它们通过聚合根ID来访问,返回的值可以是一组属性组合出来的临时对象,也可以是聚合根或实体等DO对象。
- geek_time2020-07-06微服务能不能共用一个业务数据库。
作者回复: 按照DDD的设计方法,在聚合和限界上下文之间已经做好了对象、服务和数据的解耦工作,所以基本不会出现多个微服务共用一个库的情况。
- Tumayun2020-06-03太过抽象了,可以多举例,举一些大家都容易理解的实例
作者回复: 后面案例里面会有详细介绍。
- 剑八2020-05-24领域就是一个组织为了达到某个业务目的,而做的一系列业务活动的集合。 划分子域则是为了能够从组织架构上以及软件设计上能够更加的内骤与解耦。方便进行维护。 而子域中更细分的单位是聚合,一个聚合代表了若干能够协同工作的实体集合,一个聚合所做的事情是比较聚焦的。 在领域驱动设计中,对于一个未知领域往往是采用从下到上的设计方法,即先根据用例,场景分析得出实体,值对象然后划分聚合以及子域,再组合子域成为一个域。展开
- 秋雨2020-03-26老师你好,我有一个问题想问下: 现有事件风暴再有领域模型还是先划分好领域,再通过事件风暴建立领域模型?
作者回复: 领域太大的话,建议先划分子域。这是因为领域太大,不好开展事件风暴。在将领域划分成合适大小的子域后,进行事件风暴完成领域建模就比较容易了。
共 2 条评论 - 狮锅艺2020-03-17学习打卡