我开始使用 CQRS,并认为在我的表单上使用 Command 对象作为模型是最有意义的。我可以利用 DataAnnotations 对命令的一些客户端验证,客户端验证,使其非常干净......
我的问题...这会引起任何问题吗?如果我的命令没有默认构造函数,这会使这个过程变得不可能吗?我是否需要创建自己的可以构造函数注入聚合 ID 的 CommandModelBinder?
你的想法,我在任何地方都找不到这种技术,我假设因为它不起作用。
我开始使用 CQRS,并认为在我的表单上使用 Command 对象作为模型是最有意义的。我可以利用 DataAnnotations 对命令的一些客户端验证,客户端验证,使其非常干净......
我的问题...这会引起任何问题吗?如果我的命令没有默认构造函数,这会使这个过程变得不可能吗?我是否需要创建自己的可以构造函数注入聚合 ID 的 CommandModelBinder?
你的想法,我在任何地方都找不到这种技术,我假设因为它不起作用。
我建议您查看 Greg Young关于基于任务的 UI 的文章,了解 DTO 和消息如何与您的系统(客户端和服务器端)交互。
我同意 Sebastian 的观点,即您的命令将与您的用户界面外观完全匹配。因此,您可能需要拥有单独的 DTO/Model 类和命令。这确实不是一件坏事,因为您的模型实际上是系统查询端的结果,并且实际上不应该与您发送到系统的消息完全相同。
此外,通过将命令与模型分开,您对 Command 构造函数的担忧就消失了。您的控制器只是从客户端收集信息,构建命令然后提交它。
如果您开始使用 CQRS,Greg 的网站 (cqrsinfo.com) 非常好,尤其是他的6 1/2 小时视频。是的,它是 6 1/2 小时,但它确实是对 CQRS 的全部内容的一个很好的介绍和概述。它极大地帮助了我。
希望这可以帮助!
使用 POST 将命令发送到域命令处理程序似乎是明智的。但它不太可能是您将界面绑定到的确切对象。界面中的命令(例如鼠标点击)将成为域命令(创建用户)。您的 GUI 最有可能绑定到查询的结果。
由于您提到的原因,您将创建视图模型,它们基本上是您在客户端和服务器之间发送的 dto。通过这种方式,您可以使用所有 mvc 优点,例如模型绑定、数据注释等。然后在您的控制器中创建命令并将命令发送到服务总线。
我认为这将帮助您更好地分离关注点,并且在我看来更容易测试。