Events 读写通用服务-CQRS+;DDD

Events 读写通用服务-CQRS+;DDD,events,domain-driven-design,cqrs,event-sourcing,Events,Domain Driven Design,Cqrs,Event Sourcing,嘿,我有一个聚合根,其中包含一些需要计算的属性-总计。 这些属性不会保存,但需要在种子设定时填充readDto,并在创建或更新aggregateRoot时为EventStore填充事件 在读取和写入部分之间有一个公共服务,该服务将计算这些总计,并将其提供给DTO或事件或任何需要它们的地方,这是一种好的做法吗 共事 允许使用您通常使用的任何有效技术来影响干燥原理(但请记住,要用适当的方法来缓和这一点) 有时,这意味着在写入/决策过程和投影服务之间复制一个助手文件。有时,您甚至可以将它们编译到单个帮

嘿,我有一个聚合根,其中包含一些需要计算的属性-总计。 这些属性不会保存,但需要在种子设定时填充readDto,并在创建或更新aggregateRoot时为EventStore填充事件

读取写入部分之间有一个公共服务,该服务将计算这些总计,并将其提供给DTO或事件或任何需要它们的地方,这是一种好的做法吗

共事

允许使用您通常使用的任何有效技术来影响干燥原理(但请记住,要用适当的方法来缓和这一点)

有时,这意味着在写入/决策过程和投影服务之间复制一个助手文件。有时,您甚至可以将它们编译到单个帮助程序库中。有时是动态语言中的一段代码,可以针对决策过程、投影服务或读者过程上下文中的事件实例(或被折叠的一系列事件)运行

没有一条基本定律规定必须有一件事(一段作为单个服务运行的已编译代码)拥有该规则——首先,如果您希望在不停机的情况下将更新部署到该服务,会发生什么

简言之,没有硬性规定;任何这种一刀切的处方都会有数百个例外。有点像企业范围的通用数据模型;)

我并不害怕使用单一服务来打破枯燥的原则

我真正关心的是,使用普通的读/写东西是否违反 CQRS模式

这通常是合理的——读者和作者都观察事件流,以推断(“折叠”)滚动状态。读者可能会公开上下文信息,这些信息可用于驱动“用户”制定表示所需动作/状态转换的命令,这些动作/状态转换必然有一定程度的重叠。关键是决策本身应该只存在于写端(但这很符合一般原则,即命令通常不应产生反馈-通常它应该是可幂等处理的,任何验证等都是既成事实的安全驱动的双重检查)

其次,如果在读取部分中使用逻辑是违反CQRS模式的

一个典型的共识是,在褶皱中有条件逻辑来维持滚动状态——这应该是简单的机械累积

对于基于观察事件而保持最终一致只读视图的投影和/或反规范化器,通常将使用重叠的简单投影逻辑。如果逻辑变得复杂,涉及到事务等,这就是设计的味道——如果事件代表自然发生的事情而不是人为的,它们应该倾向于相对简单地映射/投影-实际上,您应该只“索引”它们或以适合读者给定需求的形式进行布局


如果你在投影系统中遇到了复杂的流,那就意味着你可能有多个不同的读取器,并且可能会考虑单独的投影到那个末端(例如,有点像界面分离原理)

嘿,Ruben,我不害怕使用单一的服务破坏干式原理。我真正关心的是使用普通的读/写内容是否违反CQRS模式。第二,如果在读取部分使用逻辑违反CQRS模式,@IvelinMatev补充了一个杂乱无章的回答——笼统地谈论CQRS就是一个解决方法。如果你有一个真实领域的真实例子,请随时发布后续问题,我或其他人会回答。如果您对该领域更一般的讨论感兴趣,DDD-CQRS-ES slack是一个很好的资源(ggl搜索以查找邀请站点)