public async Task Process(IncomingStepContext context, Func <Task> next)
        {
            var message   = context.Load <Message>();
            var messageId = message.GetMessageId();

            var transactionContext = context.Load <ITransactionContext>();
            var messageData        = await _msgStorage.Find(messageId) ?? new MessageData()
            {
                MessageId = messageId
            };

            TryMountMessageDataOnTransactionContext(messageData, transactionContext);

            // invoke the rest of the pipeline (most likely also dispatching the incoming message to the now-ready saga handlers)
            await next();

            // everything went well - let's save message data
            await SaveMessageData(messageData);
        }