Как вы регистрируете поведение для выполнения после метода "Handle" в NServiceBus 6?

У меня есть Endpoint с Handle метод. Я хотел бы сделать что-то непосредственно перед и сразу после Handle, Я был в состоянии заставить шаг работать раньше, подавляя LogCommandEntryBehavior : Behavior<IIncomingLogicalMessageContext>, Что должно быть реализовано, чтобы это произошло сразу после Handle?

1 ответ

Решение

В версии 6 NServiceBus конвейер состоит из серии этапов, каждый из которых вложен в предыдущий, как набор русских кукол. Для входящего сообщения, этапы (по порядку):

  • ITransportReceiveContext,
  • IIncomingPhysicalMessageContext,
  • IIncomingLogicalMessageContext, а также
  • IInvokeHandlerContext

Когда вы создаете поведение на этапе, вы получаете делегата с именем next(), Когда вы звоните next() Вы выполняете следующее поведение в конвейере (что может переместить конвейер на следующую стадию). Призыв к next() возвращает Task который указывает, когда эта внутренняя часть конвейера завершена.

Это дает вам возможность вызывать код перед переходом к следующему этапу и вызывать больше кода после завершения следующего этапа, например:

public class LogCommandEntryBehavior : Behavior<IIncomingLogicalMessageContext>
{
    public override async Task Invoke(IIncomingLogicalMessageContext context, Func<Task> next)
    {
        // custom logic before calling the next step in the pipeline.

        await next().ConfigureAwait(false);

        // custom logic after all inner steps in the pipeline completed.
    }
}

Если вы хотите записать информацию об обработке сообщения, я рекомендую посмотреть на IInvokeHandlerContext этап. Он содержит информацию о том, как было обработано сообщение, и будет вызываться один раз для каждого вызываемого обработчика (в случаях, когда у вас их несколько). Если вам не нужна информация на этом уровне, то IIncomingLogicalMessageContext это, вероятно, все, что вам нужно.

Вы можете прочитать больше о версии 6 на сайте Particular Docs:

Другие вопросы по тегам