【发布时间】:2022-10-13 13:21:27
【问题描述】:
我正在使用 Mass Transit 的 FSM Automatonymous 包通过实体框架集成将 saga 状态保存到 DB 中,因此我有一个 saga 类映射到包含相关 ID、saga 状态和几个时间戳的 DB 表。一切正常。
在阅读了其他人的各种解决方案之后,我已经实现了一个条件转换,之前我已经使用两步过程解决了这个问题:
- 查询条件并将结果存储在 saga 实例中的临时变量中
- 使用
ifelse(condition, func, func)分支到下一个状态以前我使用的是内存中的 saga 存储库,因此向 saga 实例类添加另一个变量并不是一件容易的事。但是现在我的 saga 实例类是一个 EF 绑定模型,所以我会因此需要向数据库添加另一列并刷新模型等。我可以这样做,但我想避免在数据库表(以及通常的持久性模型)中乱扔真正应该是一个非常短暂的内存变量。
具体来说,我的 FSM 正在检查远程服务,该服务使用响应来回复命令,我们检查它们是否正确回复。
所以我想做这样的事情:
When(DoTheProcessMessage) .Then(context => { context.Instance.ValidationResult = service.validateResponse(context.Data.command, context.Data.response); }) .IfElse(context => context.Instance.ValidationResult, binder => binder .TransitionTo(ContinueSomeProcess), binder => binder .TransitionTo(StartValidationFailureRepairProcess) ),这意味着我必须将
ValidationResult添加到我的数据模型和数据库架构中,但只需要“桥接”这两行。是否有另一种方法可以执行 if-else 转换而不必将结果存储在实例中?
由于其他依赖项,我目前停留在大众运输的 v5 上。
我读过了
Skip a Mass Transit state in an if-else clause
Conditional transition in MassTransit Automatonymous saga
MassTransit Saga State : Would like to do action after moving the state
【问题讨论】:
标签: c# .net masstransit state-machine automatonymous