作者回复: 我需要时间整理一下哈,等好了再共享。
作者回复: 本来没准备放代码的哈,我后面花时间整理一下吧。
作者回复: CQRS其实就是读写分离,主要解决DDD的复杂查询问题。一般是写库和读库分离,但是实效性不容易保证。其实你也可以在同一个库,用领域或者应用查询服务来完成复杂查询的。
作者回复: 正在准备,好了会通知大家的。
作者回复: 聚合内有实体吧,看看这些实体跟那个聚合根关联紧密,生命周期归聚合根管理,就放在跟聚合根在一起的聚合内,如果别的聚合要用,有两种方案,第一种是通过聚合根引用实体。第二种方案,在另外的聚合内将这个实体设计为值对象或者实体,值对象或实体的数据来源于另外的那个聚合的实体。
作者回复: 新增和修改,以及针对聚合根的简单查询,都是通过聚合根来整体操作的。
对于复杂查询,可以不走领域层,按照传统模式操作就可以了。
作者回复: 业务流是流程阶段,命令是在这个流程阶段的某个流程的一些操作,操作包括前后端或应用之间的动作。
作者回复: 是从文件系统导入吗?你可以在应用服务中打开文件,调领域层的服务来实现。
作者回复: 可以通过BFF的模式,各业务平台完成自己的细粒度功能开发,由BFF微服务完成各业务功能组合和编排,对外提供粗粒度的接口服务。这样第三方就不需要了解太细的业务编排和实现细节了。测试也只需要对粗粒度的接口测试了。
作者回复: 下单是命令,订单已下单是事件。
作者回复: 可以的啊,这只是一种手段。只要你们统一团队语言和目标,找到产品的核心价值点,多种方法都可以。
作者回复: 实体自身的业务行为就可以作为实体的方法。DDD的领域模型更能体现面向对象的设计。涉及到多个实体的业务行为用领域服务。
作者回复: 需要整体替换,值对象会保证发生业务那一刻的数据与源端数据一致,如果源端数据变化了,数据要一致,需要整体替换。
作者回复: 复杂的查询建议独立出来,通过CQRS来实现,可以根据时效性要求设计为读写同一个库或者读写库分离的方式,复杂的查询逻辑可以独立为应用或者领域服务。复杂聚合的实体初始化建议用工厂类服务,简单的直接用构造函数就可以了。
作者回复: 是的。请假聚合根会关联人员聚合的人,然后导航到审批人。
作者回复: 这个DO对象是领域模型的实体对象,放在Entity目录下。DTO转DO是将外部请求数据转换为领域模型的实体对象。
作者回复: 在DDD里面没有提到controller这个概念。按照分层理论,它承担应用服务与前端应用适配的工作,感觉应该是属于基础层或者用户接口层。
作者回复: 审批规则有两个,一个是审批规则的配置数据,独立存在。另一个是保存在请假单上的审批规则,它根据请假基本信息匹配审批规则配置数据后获得,只要请假基础数据不变,你就不需要在每次提交审批的时候去查询审批规则的配置数据。依附于请假单的这个审批规则是值对象。
作者回复: 不好意思哈,电商的内部流程我不是太熟悉哦。
不过不管什么样的业务,你最终目的就是为了找出命令、实体等领域对象,然后构建聚合和限界上下文。
你可以通过场景分析,模拟一个人在系统中的旅程,去分步骤操作就可以了。
作者回复: 可以多场景多角色,主要目的是找出所有的命令和实体对象。只要能达到这个目的,可以采用多种方法。