【问题标题】:Command model classes shared between Command and Event classes in CQRSCQRS 中的命令和事件类之间共享的命令模型类
【发布时间】:2020-11-22 13:46:18
【问题描述】:

在我当前使用 Java 的 EventSourcing 和 CQRS 的 Monolithic 应用程序中,我们有一个单独的写入和读取模型。

package com.command;
class Address{ //class created in Command Write model
   String address;
} 

package com.command;
import com.command.Address;
class CreateEmployeeCommand { //Command class belongs to Write Model
  Address address; //this is correct
}


package com.events;
import com.command.Address;
class EmployeeCreatedEvent { //Event class belongs to Read Model
 Address address; //this should not be correct IMO, instead seperate Address class should be created in event package.
}

在上述命令和事件类中,命令模型类“地址”已在它们之间共享。我认为上面是不正确的,而是应该为每个读写模型创建单独的地址类。通过使用上述方法,我们是否违反了关注点分离原则?以及如果我们在 Command 和 Event 类之间共享相同的 Command 模型,我们真正面临的其他实际问题是什么。请让我知道我的想法是对还是错..

【问题讨论】:

  • 有人知道上面的答案吗?

标签: microservices cqrs event-sourcing event-driven event-driven-design


【解决方案1】:

我认为你在这里不正常。

CreateEmployeeEmployeeCreated 在内存中表示消息;这些消息是 API 表面的一部分。如果你的CreateEmployee schemaEmployeeCreated schemaAddress 有相同的理解,那么如果你也有相同的理解,你就不太可能遇到问题数据结构。

换句话说,您想应用于Address 的相同约束也适用于CustomerId 等更简单的事物;是的,您的模型中可以有多个CustomerId 的表示,但是您从中获得了什么优势?


在某些地方,同一个广义概念的多种表示可能有意义:例如,UnverifiedAddress 和 VerifiedAddress 是两个不同的东西。

在某些情况下,消息的消费者使用与生产者不同的内存表示是有意义的 - 您的读取模型使用的内存表示可能与写入模型使用的不同。同样,不同的消费者对同一想法有不同的记忆表示可能是有意义的。

当您处理以不同语言实现的消费者时,这是最简单的版本。当您使用单体时不太可能出现。

【讨论】:

  • 嗨,首先感谢您的解释。但我的疑问是:将命令模型共享到事件类似乎不是更好的方法。因为事件输出和命令输入可能会有所不同,对吧?最好的做法是什么?应该为每个命令和事件类创建单独的模型?还是可以毫无问题地共享?不管我们的应用是单体还是微服务
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
相关资源
最近更新 更多