将CQRS命令直接传递给Domain对象

Aar*_*nHS 8 domain-driven-design cqrs

~TLDR:我正在为我的一个大型项目实现CQRS + DDD解决方案,我想知道是否有任何真正的原因导致我的命令处理程序无法直接将命令对象分配给我的聚合,在一个小的极少数情况下,命令对象数据丰富?我找不到任何具体的理由,为什么这会是任何一种反模式,我找不到任何有关这种类型设计的详细信息.

背景:之前我已经实现了CQRS系统,并且我已经实现了DDD应用程序,但在适当的Eric Evans样式域驱动的应用程序中从未实现过CQRS + DDD.所以我问,因为我不想滥用我的聚合物,并且长期伤害我的应用程序.

我的命令对象拥有相当多的数据的一个例子是一个注册命令,它接收8个以上的字段(名字,姓氏,首选名称,dob,标题,用户名,密码,部门等).在我的Aggregate上创建一个有8个参数的方法,并且使用某种dto的替代解决方案,让我的处理程序将命令映射到dto - 要么自动使用automapper,要么是内联的 - 感觉非常尴尬似乎是不必要的非增值抽象.

我还可以看到未来的用例,其中命令可能是数据丰富的(它不会占很大比例的命令,但仍然会有一些),所以我希望从一开始就让这个看似微不足道的方面正确.

pla*_*alx 13

命令对象通常以基本类型表示,而聚合方法签名将以域概念表示.

您没有立即认识到这一事实可能意味着您错过了很多机会在您的域中明确隐含概念.

"一个注册命令,包含8个以上的字段(名字,姓氏,首选名称,dob,标题,用户名,密码,部门等)"

你应该打你的是,firstnamelastname肯定可以形成一个有意义的整体,比如new FullName(firstname, lastname)和我敢肯定有很多其他的情况下,值对象(VO)可以或应该在你的域名使用...... Username,Password等等?使用VO对一起变化的事物进行建模将更好地描述您的模型,并减少您必须传递的参数数量.

因此,这会使命令对象成为聚合方法参数的不良候选对象.如果你走这条路,你肯定会错过建模机会.