CQRS:类冗余并将DTO传递给域

mbu*_*bue 5 c# domain-driven-design cqrs

我的CQRS应用程序有一些复杂的域对象.创建它们时,实体的所有属性都由用户直接指定,因此

CreateFooCommand有大约15个属性.

因此,FooCreatedEvent也有15个属性,因为我需要读取端的所有实体属性.

由于必须将命令参数分派给域对象,并且不应将FooCreatedCommand传递给域,

有一个从CreateFooCommand到域的手动映射.

由于域应该创建域事件,

这是从域Foo属性到FooCreatedEvent的另一个映射.

在读取方面,我使用DTO来表示Foo的结构,因为它存储在我的读模型中.

因此,更新读取端的事件处理程序引入了从事件参数到DTO的另一个映射.

为了实现一个简单的商业案例,我们有

  • 两个冗余类
  • 基本相同属性的三个映射

我想要摆脱命令/事件参数并推送DTO对象,但这意味着域可以接收或创建DTO并将其分配给事件.

序列:

REST Controller --Command+DTO--> Command Handler --DTO--> Domain --(Event+DTO)--> Event Handler
Run Code Online (Sandbox Code Playgroud)

关于使CQRS减少实施痛苦的任何想法?

Con*_*enu 5

我看到以下选项:

  1. 创建一个不可变DTO类FooDetails所使用的两个CreateFooCommandFooCreatedEvent通过在构造其注入; 类型提示聚合方法反对FooDetails;例如new CreateFooCommand(new FooDetails(prop1, prop2, ...))

  2. 创建一个不可变的基类FooDetails,该基类由CreateFooCommandFooCreatedEvent和 类型 提示聚合方法针对FooDetails

  3. 彻底改变风格,使用cqrs.nu提倡的风格,直接向聚合发送命令;聚合具有命令方法,例如FooAggregate::handle(CreateFooCommand command);我个人经常使用这种风格。