【发布时间】:2015-08-06 16:55:44
【问题描述】:
~TLDR:我正在为我的一个大型项目实施 CQRS + DDD 解决方案,而且,我想知道我的命令处理程序是否有任何真正的原因不能直接将命令对象分派到我的聚合中,在少数情况下,命令对象的数据丰富?我找不到任何具体原因说明这会是一种反模式,我也找不到任何关于这种设计的非常详细的意见。
背景:我以前实现过 CQRS 系统,也实现过 DDD 应用程序,但从未在适当的 Eric Evans 风格的域驱动应用程序中实现 CQRS + DDD。所以我问是因为我不想滥用我的聚合,并从长远来看伤害我的应用程序。
一个包含大量数据的命令对象的示例是一个注册命令,它包含 8 个以上的字段(名字、姓氏、首选名称、dob、标题、用户名、密码、部门等)。在我的 Aggregate 上创建一个有 8 个参数的方法感觉非常尴尬,以及使用某种 dto 的替代解决方案,并让我的处理程序将命令映射到 dto - 自动使用 automapper 或内联 - 似乎是不必要的非增值抽象。
我还可以看到未来的用例,其中命令可能是数据丰富的(命令不会占很大比例,但仍然会有一些),所以我想纠正这个看似微不足道的方面开始。
【问题讨论】:
-
据我记得,DDD 并没有具体说明如何实现域模型,但 CQRS 可以。这里没有冲突。关于简单的命令对象,您是如何将它们传递给聚合的?我猜你有一个两者都依赖的抽象/接口。
-
我通过参数将命令数据(不是实际的命令对象)传递给聚合。该命令由加载聚合的处理程序接收,并通过适当设计的方法简单地将其传递给它。通常它只是一个或几个参数,这是我喜欢的方式,因为我相信设计良好的聚合应该具有需要很少参数的方法。否则它可能会以某种方式违反 SRP。但是,有一些可能需要大量参数的边缘情况。
-
您是否考虑将整个命令对象传递给聚合?看起来很简单,这里没有缺点。
-
这实际上是我的问题:我想知道我的命令处理程序是否有任何真正的原因不能直接将命令对象分派到我的聚合中跨度>
-
@neleus CQRS 是一个实现细节,所以我宁愿避免用这个概念污染域。