CQRS - 复杂类型

CQRS - Complex types

遵循CQRS模式,是否允许在命令中添加复杂类型? (参见下面示例中的 "Address"-class)

public interface ICommand{}

public class RegisterNewUser: ICommand{
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public List<Address> Addresses {get;set;}
}

public class Address{
    public string Street {get;set;}
    public string City {get;set;}
}

public class RegisterNewUserHandler: ICommandHandler<RegisterNewUser>{
    //Do some stuff
}

在我看来,我会说是的...但我想我见过其他人说你不能这样做。

简而言之,我认为应该是,除非有人对此有充分的论据。

让我们这样看:我们有一个用户注册,他注册了他的三个地址,然后单击保存按钮触发我们在服务器端的命令。太好了,我们的应用程序现在将创建分成两个命令,一个保存地址,另一个保存真实的人并链接它们。

现在,在保存我们的地址后,我们的应用程序崩溃了(出于一些不相关的原因),哦不!现在我们的数据库中保存了三个地址,但没有用户。恭喜,我们的数据库现在包含死数据!

Following the CQRS pattern, is it allowed to add complex types inside the command?

是的。

真正复杂的地方:尝试修改存储在不同位置的类型。

因此,例如,如果您要将对用户的更改存储在 "user repository" 中,并将对地址的更改存储在 "address repository" 中,并且您没有某种保证存储库将由同一事务控制,那么您将开始 运行 一致性问题。