Пример #1
0
        /// <inheritdoc/>
        public async Task <ProcessResponse> Execute(ProcessRequest <TState> request, ProcessMiddlewareDelegate next, CancellationToken token)
        {
            var response = await next();

            foreach (var message in response.ProcessMessages
                     .Where(s => !s.IsPublished)
                     .Select(s => s.Message))
            {
                var executionResult = await PublishMessageAsync(message);

                if (executionResult.Success)
                {
                    await store.MarkMessageAsPublishedAsync(request.Id, message);
                }
            }

            return(response);

            Task <IExecutionResult> PublishMessageAsync(IMessage msg) =>
            msg switch
            {
                ICommand cmd => commandBus.PublishAsync(cmd),
                Notification notification => notificationBus.PublishAsync(notification),
                _ => throw new ArgumentException($"Invalid message type '{msg.GetType()}'."),
            };
        }
        /// <inheritdoc />
        public async Task <ProcessResponse> Execute(ProcessRequest <TState> request, ProcessMiddlewareDelegate next, CancellationToken token)
        {
            var response = await next();

            var correlationId = request.State is IIntegrationEvent @event
                ? @event.CorrelationId
                : Unified.NewCode();

            var processMessages = response.ProcessMessages
                                  .Select(m =>
            {
                m.Message.CorrelationId = correlationId;
                EnrichWithUserId(m.Message, options.ActorId);
                EnrichWithRoles(m.Message, "[]");

                var principal = new Principal
                {
                    IdentityId       = options.ActorId,
                    UserId           = options.ActorId,
                    IsProcessManager = true,
                };

                m.Message.Actor = principal.AsActor();
                if (m.Message is Command cmd)
                {
                    cmd.Principal = principal;
                }

                return(new ProcessMessage(m.Message, m.IsPublished));
            })
                                  .ToArray();

            return(new ProcessResponse(response.Id, processMessages, response.IsPersisted));
        }
        /// <inheritdoc/>
        public async Task <ProcessResponse> Execute(ProcessRequest <TState> request, ProcessMiddlewareDelegate next, CancellationToken token)
        {
            var messages = await store.GetMessagesAsync(request.Id);

            return(messages.Count > 0
                ? new ProcessResponse(request.Id, messages, true)
                : await next());
        }
Пример #4
0
        /// <inheritdoc/>
        public async Task <ProcessResponse> Execute(ProcessRequest <TState> request, ProcessMiddlewareDelegate next, CancellationToken token)
        {
            var response = await next();

            if (!response.IsPersisted && response.ProcessMessages.Count > 0)
            {
                await store.PersistMessagesAsync(request.Id, response.ProcessMessages.Select(s => s.Message).ToArray());
            }

            return(new ProcessResponse(response.Id, response.ProcessMessages, true));
        }
        /// <summary>
        /// Execute process pipeline.
        /// </summary>
        /// <param name="request">Process request.</param>
        /// <param name="handler">Process handler.</param>
        /// <param name="token">Cancellation token.</param>
        /// <returns>Task.</returns>
        public Task ExecutePipline(ProcessRequest <TState> request, IProcessHandler <TState> handler, CancellationToken token)
        {
            var delegates = new List <Func <ProcessMiddlewareDelegate, ProcessMiddlewareDelegate> >();

            foreach (var middleware in middlewares)
            {
                delegates.Add(next =>
                {
                    return(() => middleware.Execute(request, next, token));
                });
            }

            ProcessMiddlewareDelegate execute = () => handler.Handle(request, token);

            foreach (var @delegate in delegates)
            {
                execute = @delegate(execute);
            }

            return(execute());
        }