在DDD上观看了Greg Yound的这段视频

http://www.infoq.com/interviews/greg-young-ddd

我想知道当内存发生变化时如何用DDD实现命令查询分离(CQS)?

使用CQS,您有两个存储库,一个存储库用于命令,一个存储库用于查询。
以及两个对象组,即命令对象和查询对象。
命令对象仅具有方法,没有可以暴露对象形状的属性,并且不能用于在屏幕上显示数据。
另一方面,查询对象用于将数据显示到屏幕上。

在视频中,命令总是转到数据库,因此您可以使用查询存储库来获取更新的数据并在屏幕上重新显示。

您是否可以在ASP.NET中使用CQS和诸如“编辑”屏幕之类的功能,在内存中进行更改,并且需要将该更改屏幕多次更新,然后才能将更改持久保存到数据库中?

例如

  • 我从查询存储库中获取一个查询对象,并将其显示在屏幕上
  • 我单击编辑
  • 我从查询对象存储库中重新获取查询对象,并以编辑模式
  • 将其显示在表单上
  • 我更改了表单上的值,该值会自动回传并获取命令对象,并发出相关命令
  • 操作:现在,当命令对计算字段进行更改时,我需要显示更新的对象。由于命令对象尚未保存到数据库中,因此无法使用查询存储库。而且,使用CQS并不是要公开要在屏幕上显示的命令对象的形状。如何将查询的对象与更新后的更改一起显示在屏幕上。

  • 我可以想到的两个可能的解决方案是拥有一个 session 存储库,或者是一种从命令对象中获取查询对象的方法。
    还是CQS不适用于这种情况?

    在我看来,视频中的更改会立即保留到数据库中,并且我还没有找到带有CQS的DDD示例,该示例解决了将更改批量添加到域对象并更新修改后的域对象的 View 的问题。最后发出命令以保存域对象。

    最佳答案

    如果您真的想为此使用CQS,那么我想说查询存储库和写存储库都具有对同一个后备存储的引用。通常,此引用是通过外部数据库进行的-但在您的情况下,它可以是List 或类似的引用。

    10-08 20:09