我遇到CQRS项目的情况,我必须记录用户的信息请求(查询),然后根据数据存储的响应选择启动工作流程。用户正在请求需要立即反馈的信息。同时,系统可选地启动工作流以分析请求。我如何在CQRS中实现这一点,因为请求既不是'纯'查询也不是'纯'命令?
修改 为此添加更多上下文:应用程序就像一个搜索应用程序,用户在查询中输入,应用程序返回结果。但是,应用程序还会记录查询,并可以根据服务器的响应启动工作流程。该应用程序还“记住”用户的最后几个查询,并使用它为新查询提供上下文。
此外,查询响应可能不同步。后台工作人员可能负责将结果传递给客户。
答案 0 :(得分:1)
虽然你给了我们很少的工作,但我认为这个问题有一个简单的答案:
我不同意你的意见,请求既不是'纯'查询也不是'纯'命令。请求是纯查询,因为请求不是分析请求,而是请求信息。可选地由请求触发的分析是命令,但是在查询事件的上下文中是命令。因此,系统,或者更具体地说是事件处理程序,是命令上下文中的actor,而不是用户,它是查询上下文中的actor。
任何查询都没有副作用。它的目的是使它成为一个查询。
答案 1 :(得分:0)
此类请求为command。
在简单的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将相关信息返回给客户端。
答案 2 :(得分:0)
执行查询后发送通知消息怎么样?我可能会使用像:
这样的装饰器public QueryRs query(QueryRq rq) {
final QueryRs rs = target.query(rq);
notifier.notifyQueryDone(rs);
}
使工作流程订阅并使用该消息。我不确定这个查询是否会考虑改变此解决方案中的状态?