Если мы настроим сагу и сразу же 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.
Мы видели некоторые ссылки на передачу ConsumeContext
в качестве параметра в Publish()
, однако неясно, в каком контексте это нужно (Intellisense просто ссылается на context1, context2, context3 и т. Д.).
Есть ли способ использовать Publish()
после того, как RaiseEvent()
уже вызван? Если нет, есть ли способ опубликовать событие, используя какой-то другой механизм?
Версия MassTransit - 5.1.5, а автоматная - 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
? Это найти автобус и привязки?