Как вы регистрируете поведение для выполнения после метода "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: