2

我在 CQRS 项目中有一种情况,我必须记录用户对信息的请求(查询),然后可以选择根据数据存储的响应启动工作流。用户正在请求需要立即反馈的信息。同时,系统可选地启动工作流来分析请求。由于请求既不是“纯”查询也不是“纯”命令,如何在 CQRS 中实现这一点?

编辑: 为此添加更多上下文:该应用程序就像一个搜索应用程序,用户输入查询,应用程序返回结果。但应用程序也会记录查询,并可以根据服务器的响应启动工作流。应用程序还“记住”用户的最后几个查询,并使用它为新查询提供上下文。

此外,查询响应可能不是同步的。后台工作人员可能负责将结果传递给客户端。

4

3 回答 3

1

虽然你给我们的工作很少,但我认为这个问题有一个简单的答案:

我不同意您的请求,即该请求既不是“纯”查询也不是“纯”命令。请求是纯粹的查询,因为请求不是分析请求,而是信息请求。可选地由请求触发的分析是命令,但是查询事件上下文中的命令。因此,系统,或者更具体地说是事件处理程序,是命令上下文中的参与者,而不是用户,用户是查询上下文中的参与者。

没有任何查询是无副作用的。它是一个查询的意图。

于 2013-09-07T16:27:23.837 回答
0

这样的请求就是命令

在简单的 OOP 中,我经常将此类消息建模为带有 out 参数的 void 方法。

例如,在财务模型中,我有一个咨询合同(实体和聚合根)执行规则来构建财务建议(实体,不可变)。最终推荐的发布是用这样的命令建模的:

public interface IAdvisoryContract
{
    ContractNumber Number { get; }

    // lot of well documented commands and queries here...

    /// 90 lines of documentation here...
    void PublishRecommendation(
               IUser advisor, IAssetClassBreakdownAnalysis assetClassAnalysis,
               IVolatilityAnalysis tevAnalysis, Time time,
               out IRecommendation newRecommendation);

    event EventHandler<EventArgs<RecommendationNumber>> RecommendationPublished;
}

在 CQRS 中,这取决于您的基础架构:例如,在类似的 HTTP 情况下,我使用 POST 将相关信息返回给客户端。

于 2013-09-06T13:35:01.957 回答
0

查询执行后发送消息通知怎么办?我可能会使用像这样的装饰器:

public QueryRs query(QueryRq rq) {
     final QueryRs rs = target.query(rq);
     notifier.notifyQueryDone(rs);
}

并使工作流订阅和消费消息。我不确定此查询是否考虑更改此解决方案中的状态?

于 2013-09-10T00:58:10.043 回答