0

如果我们设置了一个 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。

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

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

MassTransit 版本是 5.1.5,Automatonymous 是 4.1.2


编辑根据 Chris Patterson 在这里的回答,我们尝试在任何Initially或之外添加以下内容During

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

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

附带问题,也许这将有助于我理解为什么Publish并且RaiseEvent似乎不能很好地一起玩 - 为什么Publish需要ConsumeContext? 是定位总线和绑定吗?

4

2 回答 2

0

您应该可以添加

When(SomeState.Enter)

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

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

于 2018-11-05T12:14:12.040 回答
0

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

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

而不是这个:

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

现在有点道理 - 后者(如 Chris Patterson 提到的)创建一个 newEventContext而前者使用 given context。我们不知道这Raise是传入的可用方法context

于 2018-11-08T05:57:34.563 回答