コード例 #1
0
    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);
    }