gpt4 book ai didi

c# - 当命令需要结果数据时,如何应用命令查询分离 (CQS)?

转载 作者:IT王子 更新时间:2023-10-29 03:45:45 25 4
gpt4 key购买 nike

维基百科对 command query separation 的定义, 据称

More formally, methods should return a value only if they are referentially transparent and hence possess no side effects.

如果我正在发出命令,我应该如何确定或报告该命令是否成功,因为根据此定义该函数不能返回数据?

例如:

string result = _storeService.PurchaseItem(buyer, item);

此调用中包含命令和查询,但查询部分是命令的结果。我想我可以使用命令模式重构它,如下所示:

PurchaseOrder order = CreateNewOrder(buyer, item);
_storeService.PerformPurchase(order);
string result = order.Result;

但这似乎增加了代码的大小和复杂性,这不是一个非常积极的重构方向。

当您需要操作的结果时,有人能给我一个更好的方法来实现命令-查询分离吗?

我是不是漏掉了什么?

谢谢!

注意事项:Martin Fowler 对 cqs 的限制有这样的说法 CommandQuerySeparation :

Meyer likes to use command-query separation absolutely, but there are exceptions. Popping a stack is a good example of a modifier that modifies state. Meyer correctly says that you can avoid having this method, but it is a useful idiom. So I prefer to follow this principle when I can, but I'm prepared to break it to get my pop.

在他看来,重构命令/查询分离几乎总是值得的,除了一些简单的小异常(exception)。

最佳答案

这个问题很老,但还没有得到令人满意的答案,所以我将对将近一年前的评论做一些详细说明。

使用事件驱动的架构很有意义,不仅是为了实现清晰的命令/查询分离,还因为它打开了新的架构选择并且通常适合异步编程模型(如果您需要扩展您的架构很有用) .通常情况下,您会发现解决方案可能在于以不同的方式对您的域进行建模。

让我们以您的购买为例。 StoreService.ProcessPurchase 是处理购买的合适命令。这将生成一个 PurchaseReceipt。这是一种比在 Order.Result 中返回收据更好的方法。为了简单起见,您可以从命令返回回执并在此处违反 CQRS。如果您想要更清晰的分离,该命令会引发一个您可以订阅的 ReceiptGenerated 事件。

如果您考虑您的领域,这实际上可能是一个更好的模型。当你在收银台结账时,你会遵循这个过程。在生成收据之前,信用卡支票可能到期。这可能需要更长的时间。在同步场景中,您将在收银台等待,无法做任何其他事情。

关于c# - 当命令需要结果数据时,如何应用命令查询分离 (CQS)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3688068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com