Если мы настроим сагу и сразу 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());
Машина также никогда не переходит в состояние Final, предположительно из-за исключения, обнаруживающего ConsumeContext.
Мы видели некоторые ссылки на передачу ConsumeContext
в качестве параметра в Publish()
, однако неясно, в каком контексте это нужно (Intellisense просто ссылается на context1, context2, context3 и т. Д.).
Есть ли способ использовать Publish()
после того, как RaiseEvent()
уже был вызван? Если нет, есть ли способ опубликовать событие с помощью другого механизма?
Версия MassTransit - 5.1.5, а Automatonymous - 4.1.2.
ИЗМЕНИТЬ На основе ответа Криса Паттерсона здесь мы попытались добавить нижеприведенное за пределами любых Initially
или During
WhenEnter(NewState, state => state.Publish(context =>
new EventClass { Foo = context.Instance.Foo }
)
.Finalize();
Однако он по-прежнему ничего не публикует, и состояние никогда не переходит на Final
. Если мы добавим Then
, он также никогда не попадет в этот блок кода. Похоже, что никаких исключений не происходит. Мы также пробовали использовать When(SomeState.Enter)
, но он тоже не работает.
Дополнительный вопрос: возможно, это поможет мне понять, почему Publish
и RaiseEvent
не очень хорошо сочетаются друг с другом - зачем Publish
нужен ConsumeContext
? Это для того, чтобы найти автобус и крепления?