【问题标题】:How to avoid persisting a temporary conditional variable when MassTransit Automanyous is using Entity FrameworkMassTransit Automanyous 使用实体框架时如何避免保留临时条件变量
【发布时间】:2022-10-13 13:21:27
【问题描述】:

我正在使用 Mass Transit 的 FSM Automatonymous 包通过实体框架集成将 saga 状态保存到 DB 中,因此我有一个 saga 类映射到包含相关 ID、saga 状态和几个时间戳的 DB 表。一切正常。

在阅读了其他人的各种解决方案之后,我已经实现了一个条件转换,之前我已经使用两步过程解决了这个问题:

  1. 查询条件并将结果存储在 saga 实例中的临时变量中
  2. 使用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


    【解决方案1】:

    在写这个问题时,我想通了 - 很明显它很愚蠢!

    我可以将条件查询函数嵌入到 IfElse 本身中,无需将其临时存储在实例中。我只是在关注条件已经存储在实例中的示例,并想象 IfElse 只能访问上下文数据或其他东西。

            When(DoTheProcessMessage)
                .IfElse(context => service.validateResponse(context.Data.command, context.Data.response),
                    binder => binder
                        .TransitionTo(ContinueSomeProcess),
                    binder => binder
                        .TransitionTo(StartValidationFailureRepairProcess)
                ),
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 2012-01-21
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      相关资源
      最近更新 更多