Получение ConsumeContext недоступно при использовании MassTransit и Automatonymous Publish после предварительного использования RaiseEvent - PullRequest
0 голосов
/ 05 ноября 2018

Если мы настроим сагу и сразу же 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? Это найти автобус и привязки?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Оказалось, что решение этой проблемы заключается в следующем:

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

вместо этого:

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

Теперь это имеет смысл - последний (как упоминал Крис Паттерсон) создает новый EventContext, в то время как первый использует заданный context. Мы не знали, что Raise был метод, доступный для переданного в context.

0 голосов
/ 05 ноября 2018

Вы должны быть в состоянии добавить

When(SomeState.Enter)

в ваш Initially раздел, и он будет использовать существующий контекст. Создавая EventContext с RaiseEvent, вы не сохраняете ConsumeContext.

Вы также можете добавить WhenEnter(SomeState) вне любого блока Initially или During.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...