C# CQRS-复杂类型

C# CQRS-复杂类型,c#,cqrs,complextype,C#,Cqrs,Complextype,按照CQRS模式,是否允许在命令中添加复杂类型?(参见下面示例中的“地址”-类) 公共接口ICommand{} 公共类注册服务器:ICommand{ 公共字符串名{get;set;} 公共字符串LastName{get;set;} 公共列表地址{get;set;} } 公共课堂演讲{ 公共字符串Street{get;set;} 公共字符串City{get;set;} } 公共类RegisterNewUserHandler:ICommandHandler{ //做点什么 } 在我看来,我会说是的

按照CQRS模式,是否允许在命令中添加复杂类型?(参见下面示例中的“地址”-类)

公共接口ICommand{}
公共类注册服务器:ICommand{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共列表地址{get;set;}
}
公共课堂演讲{
公共字符串Street{get;set;}
公共字符串City{get;set;}
}
公共类RegisterNewUserHandler:ICommandHandler{
//做点什么
}

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

简而言之,我认为应该这样做,除非有人有充分的理由反对

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

现在,在保存了我们的地址之后,我们的应用程序崩溃了(因为一些不相关的原因),哦,不!我们现在在数据库中保存了三个地址,但没有用户。祝贺你们,我们的数据库现在有死数据了

按照CQRS模式,是否允许在命令中添加复杂类型

它变得非常复杂的地方是:尝试修改存储在不同位置的类型


因此,例如,如果您要将对用户的更改存储在“用户存储库”中,而对地址的更改存储在“地址存储库”中,并且您无法保证存储库将由同一事务控制,然后,您将开始遇到一致性问题。

为什么不允许您这样做?我想我读过一些不允许您使用复杂类型的内容。。。例如,您应该首先创建地址,然后在RegisterNewUser命令中使用它们的ID。但这似乎是更多的工作…也相当不安全,让我们这样看。我们创建了用户拥有的地址并成功地保护了它们,但是现在我们的应用程序崩溃了(出于一些不相关的原因),但我们还没有创建用户。我们怎么知道这些?另外,一个用户有多个地址是没有意义的,一个地址有多个用户会更有意义。纠正你说的话。谢谢(注:我把这个例子更多地看作是账单和发货地址)但最重要的是你明白我的意思;-)询问呢?也可以吗?(因为没有修改任何数据,并且您在这里给出的示例问题不适用?)
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
}