public override async Task Invoke(IIncomingLogicalMessageContext context, Func <Task> next) { var id = getId(context.Message.Instance); if (id == null) { await next(); return; } var(entity, version) = await repository.Get(id); var hasBeenProcessed = await tokenStore.HasBeenProcessed(context.MessageId); if (hasBeenProcessed) { if (entity.OutboxState.ContainsKey(context.MessageId)) { entity.OutboxState.Remove(context.MessageId); await repository.Put(entity, version); } return; //Duplicate } if (!entity.OutboxState.TryGetValue(context.MessageId, out var outboxState)) { context.Extensions.Set(entity); var messages = await InvokeMessageHandler(context, next); outboxState = new OutboxState { OutgoingMessages = messages.Serialize() }; entity.OutboxState[context.MessageId] = outboxState; version = await repository.Put(entity, version); } var toDispatch = outboxState.OutgoingMessages.Deserialize(); await Dispatch(toDispatch, context); await tokenStore.MarkProcessed(context.MessageId); entity.OutboxState.Remove(context.MessageId); await repository.Put(entity, version); }