在之前使用 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 的回答 我们尝试在任何 Initially
或 During
[=27= 之外添加以下内容]
WhenEnter(NewState, state => state.Publish(context =>
new EventClass { Foo = context.Instance.Foo }
)
.Finalize();
但是它仍然没有发布任何内容,状态也永远不会过渡到 Final
。如果我们添加一个 Then
它也永远不会命中这个代码块。似乎没有发生任何异常。我们也尝试使用 When(SomeState.Enter)
,但它也不起作用。
附带问题,因为这可能有助于我理解为什么 Publish
和 RaiseEvent
似乎不能很好地一起玩 - 为什么 Publish
需要 ConsumeContext
?是定位总线和绑定?
你应该可以添加
When(SomeState.Enter)
到您的 Initially
部分,它将使用现有的上下文。通过使用 RaiseEvent
创建新的 EventContext
,您不会保留 ConsumeContext
。
您还可以在任何 Initially
或 During
块之外添加 WhenEnter(SomeState)
。
这个问题的解决方案原来是使用这个:
.Then(context => context.Raise(SomeEvent))
而不是这个:
.Then(context => this.RaiseEvent(context.Instance, SomeEvent))
现在有点意义了——后者(正如 Chris Patterson 所提到的)创建了一个新的 EventContext
,而前者使用给定的 context
。我们不知道 Raise
是在传入的 context
.
上可用的方法
如果我们设置一个 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 的回答 但是它仍然没有发布任何内容,状态也永远不会过渡到 附带问题,因为这可能有助于我理解为什么 Initially
或 During
[=27= 之外添加以下内容]
WhenEnter(NewState, state => state.Publish(context =>
new EventClass { Foo = context.Instance.Foo }
)
.Finalize();
Final
。如果我们添加一个 Then
它也永远不会命中这个代码块。似乎没有发生任何异常。我们也尝试使用 When(SomeState.Enter)
,但它也不起作用。Publish
和 RaiseEvent
似乎不能很好地一起玩 - 为什么 Publish
需要 ConsumeContext
?是定位总线和绑定?
你应该可以添加
When(SomeState.Enter)
到您的 Initially
部分,它将使用现有的上下文。通过使用 RaiseEvent
创建新的 EventContext
,您不会保留 ConsumeContext
。
您还可以在任何 Initially
或 During
块之外添加 WhenEnter(SomeState)
。
这个问题的解决方案原来是使用这个:
.Then(context => context.Raise(SomeEvent))
而不是这个:
.Then(context => this.RaiseEvent(context.Instance, SomeEvent))
现在有点意义了——后者(正如 Chris Patterson 所提到的)创建了一个新的 EventContext
,而前者使用给定的 context
。我们不知道 Raise
是在传入的 context
.