作者回复: 是的,就是这样的。理解的很到位。
作者回复: 代码样例还没准备好,后面我找时间整理一下吧。
作者回复: 1、如果是应用服务直接调用文件或者缓存之类的,应用服务是可以之间调用仓储的。但如果中间有领域实体和数据库,则需通过领域服务,然后通过聚合根来调用仓储。
2、用户接口层大多是DTO,应用层和领域层大多是DO,基础层则是PO,在不同层之间是需要进行数据转换的。我有一节专门讲这个。
3、如果是这样的话,确实领域层与数据库层会有耦合。领域事件其实放领域层也是可以的,放应用层主要是为了统一管理。如果领域事件放在实体内部,查找和运维起来就不是太方便,而且这个实体还需要对领域事件的实体进行操作。目录结构的设计主要是从边界、分层和便利性考虑的。
作者回复: 可以这样设计的。
作者回复: 你可以这样定位。微服务内的应用层主要处理自己的逻辑编排,bff主要处理微服务之间的逻辑。
作者回复: 1、个人感觉批量大数据量的查询用仓储有点勉强,你可以用传统的方式来做。如果不涉及到领域逻辑的话,可以放应用层。
2、一个微服务的聚合内部应该不会有太多的实体和值对象吧。在目录结构里面是一个聚合一个代码目录。当然如果实在太多,你是可以再分目录的。
3、聚合内的实体数据维护是通过聚合根通过仓储来统一维护的。
4、一个微服务一个库,微服务内的多个聚合可以共用一个库,但是尽量避免聚合之间的表关联,聚合之间的数据要做到松耦合。
5、不清楚你说的单个和批处理是什么意思?聚合是具有一个完整业务功能的单位,就看你业务的粒度大小。多个不同功能的聚合是可以构成一个比较大的业务模块。
作者回复: 我在你的上个问题回复了,不知道解答你的问题了没有。不知道你的疑问在哪里?如果没解答清楚,麻烦告诉一下你的疑惑在哪里哈。
作者回复: 数据是水平切分吧,是不是这样切分后就会跨业务单元调用或者说跨中心调用?
这样的业务单元实际是不同的微服务了,你需要在应用层去做分布式事务控制,或者不同的业务单元之间用消息机制也可以。不知道我对你的场景理解的对不对?
作者回复: 是的,我感觉对应复杂的聚合在领域服务中调用repository比较顺手。第三方接口我建议放在应用服务中处理,应用服务主要对服务进行组合和编排。
作者回复: 都可以实现。但建议放在领域服务或者实体方法中。由于聚合的持久化是将所以聚合内对象作为一个整体操作,建议采用工厂和仓储模式,在领域服务中实现。
作者回复: 这里的基础层应该与基础层的技术组件有些差异。比如数据库、api网关之类的基础组件是单独部署而且可能是很多微服务共享的。这里的基础层更多的是偏向于应用与这些基础组件的交互相关的内容,比如组件驱动以及适配相关的代码等内容。
作者回复: 微服务架构下前后端分离,前端会有自己的工程的。
作者回复: 是这样的。
作者回复: 是从应用层发起的。方法是逐层封装,一直到应用服务。微服务内应尽量避免领域服务在不同聚合之间的调用,这样聚合之间耦合度会比较高。
作者回复: 在接口层定义DTO对象。数据可能来源于多个DO对象。
作者回复: 用户接口层就是用来封装应用服务和对外暴露接口的。
作者回复: 工厂模式主要是实现复杂聚合的实体的数据初始化。如果实体太多,聚合根处理起来会很复杂,通过工厂一次初始化。
作者回复: 大量复杂查询的场景下使用。DDD不擅长大量数据查询。其实CQRS查询也可以在同一个微服务内。数据分库也可以,但数据实时性不好保证。
作者回复: 不同的对象在不同的层转换。用户接口层DTO和DO转换,应用层主要是DO,调外部微服务的服务的时候应用层有dto和do的转换。领域层与基础层之间,在基础层有DO和PO的转换。
作者回复: 对外还是尽量靠应用服务来实现。
领域服务也不是不能做,要考虑耦合和对核心逻辑的影响,综合考虑成本吧。