【问题标题】:CQRS and CRUD screensCQRS 和 CRUD 屏幕
【发布时间】:2010-12-25 09:10:54
【问题描述】:

据我了解,CQRS 的基本原则之一是命令应该以行为为中心,并且在业务或 UL 中具有价值,而不是以数据为中心,即 CRUD。我们没有专注于更新客户,而是使用诸如 CustomerHasMoved 之类的命令。如果您有用于更正某些数据的 CRUD 屏幕怎么办。例如,我们需要更改拼写错误的客户名称。这在业务中并没有太大的价值。这应该只是在 UpdateCustomer 命令的范围内吗?

【问题讨论】:

  • 拥有正确的客户名称对业务没有价值怎么办?打错名称可能意味着货物无法送达,还有其他情况......

标签: domain-driven-design cqrs


【解决方案1】:

我只是想在它弹出时快速对此发表评论。

请务必注意,有些对象实际上是 CRUD,没关系。我可能并不真正关心为什么在我将产品运送给人们并且只需要该数据来打印邮寄标签的域中名称会发生​​变化。诀窍在于将行为设置为默认行为,然后在确定您真的不关心原因时恢复到 CRUD 界面,反之亦然。

格雷格

【讨论】:

  • 感谢您的意见@Greg。我一直在谷歌上搜索,看看你对这些类型的 CRUD 场景有什么看法。我想偶尔的 CRUD 仍然可以在 DDD 方法中使用,只要绝对没有您想要捕获的行为。
  • 点赞。我们在这里花钱是为了获得功能(其次是可维护性)。想做一个完美而美丽的东西,成为一名艺术家。得到报酬,也是。请参阅我对 Julien 的回答的评论。
【解决方案2】:

实际上,更新客户姓名可能有多种原因。正如你所说,它可能拼写错误或者......你可以结婚并将你的名字改为你丈夫的名字。

如果您只有一个 UpdateCustomer 命令,您将失去最初的意图,您将无法对每个命令有不同的行为。如果名称卖错了,它可能就像更新数据库一样简单,而如果您的客户结婚了,您可能需要通知营销部门以便他们可以提供折扣。

如果您的实体是纯粹的 CRUD,即没有与修改属性相关联的意图,则可以使用 UpdateEntityCommand。然后你可以慢慢过渡到更多基于任务的东西

【讨论】:

  • 没错,那该怎么办呢?为每个可能的场景创建一个命令?
  • 是的,或者至少对于您要处理的每个场景。在我的示例中,您将从 CorrectMisspelledCustomerName 开始,然后如果需要,您将添加一个 MakeCustomerMarried 命令。 CQRS 是关于行为,而不是关于更新数据。因此,您不应该使用通用命令来更新系统中的内容
  • 如果我的客户有一个包含所有字段的大屏幕会怎样。我会发出几个命令来处理这个问题,或者以某种方式为此提出某种“行为”。也许我不应该只显示所有字段。
  • 您可能不应该一次以可编辑的方式显示所有字段,而应该有一个“基于任务”的 UI。 IE。仅在用户选择他打算执行的操作后显示字段
  • 我赞同 Julien 的回答。基于任务的 UI 绝对是 CQRS 所推动的。不要太着迷于每个任务都有屏幕。包含所有客户字段的大屏幕可能仍然存在,例如呼叫中心人员希望能够快速查看所有字段。但是这个视图应该是只读的。所有更新都可以是特定于上下文的(标记为已读、升级、正确名称等)。
【解决方案3】:

CustomerHasMoved 是在您更新客户位置后触发的事件。此事件更新读取数据库/缓存数据库。来自 gui 的命令应该是 MoveCustomer 或类似的东西。我想我会将客户名称的更新放在像 UpdateCustomer 这样的命令中。

【讨论】:

    猜你喜欢
    • 2013-09-09
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多