在之前使用 RaiseEvent 后使用 MassTransit 和 Automatonymous Publish 时获取 ConsumeContext 不可用

Getting ConsumeContext not available when using MassTransit and Automatonymous Publish after previously using RaiseEvent

如果我们设置一个 Saga 并立即 Publish(context => ...) 那么一条消息会成功到达总线。

但是,如果我们有类似的东西

Initially(
  When(SomeCommand)
     .Then(context => { context.Instance.SomeField = 5 })
     .TransitionTo(SomeState)
     .Then(context => this.RaiseEvent(context.Instance, SomeEvent)));

During(SomeState,
  When(SomeEvent)
     // ConsumeContext is not available here
     .Publish(context => new SomeEventClass
        {
           Foo = context.Instance.SomeField
        })
     .Finalize());

机器也永远不会转换到最终状态,大概是因为定位 ConsumeContext 的异常。

我们已经看到一些关于在 Publish() 中将 ConsumeContext 作为参数传递的引用,但是不清楚这需要哪个上下文(Intellisense 仅引用 context1、context2、context3 等) .

有没有办法在调用 RaiseEvent() 之后使用 Publish()?如果没有,有没有办法使用其他机制发布事件?

MassTransit 版本是 5.1.5,Automatonymous 是 4.1.2


EDIT 根据 Chris Patterson 的回答 我们尝试在任何 InitiallyDuring[=27= 之外添加以下内容]

WhenEnter(NewState, state => state.Publish(context => 
    new EventClass { Foo = context.Instance.Foo }
  )
  .Finalize();

但是它仍然没有发布任何内容,状态也永远不会过渡到 Final。如果我们添加一个 Then 它也永远不会命中这个代码块。似乎没有发生任何异常。我们也尝试使用 When(SomeState.Enter),但它也不起作用。

附带问题,因为这可能有助于我理解为什么 PublishRaiseEvent 似乎不能很好地一起玩 - 为什么 Publish 需要 ConsumeContext?是定位总线和绑定?

你应该可以添加

When(SomeState.Enter)

到您的 Initially 部分,它将使用现有的上下文。通过使用 RaiseEvent 创建新的 EventContext,您不会保留 ConsumeContext

您还可以在任何 InitiallyDuring 块之外添加 WhenEnter(SomeState)

这个问题的解决方案原来是使用这个:

.Then(context => context.Raise(SomeEvent))

而不是这个:

.Then(context => this.RaiseEvent(context.Instance, SomeEvent))

现在有点意义了——后者(正如 Chris Patterson 所提到的)创建了一个新的 EventContext,而前者使用给定的 context。我们不知道 Raise 是在传入的 context.

上可用的方法