public async Task RunPipelineAsync <TPipelineMessage>(TPipelineMessage message) where TPipelineMessage : class, IPipelineMessage { Log("PipelineMessageAsync", message); var pipelines = _factory.GetAsyncPipelines(message); if (!pipelines.Any()) { return; } if (pipelines.Count > 1) { throw new MultiplePipelinesException($"{pipelines.Count} Async Pipelines found for {message.GetType().Name}"); } dynamic thisPipeline = pipelines.First(); var builder = new PipelineBuilderAsync <TPipelineMessage>(); thisPipeline.GetPipelineTasks(builder); var taskTypes = builder.Get().ToList(); if (!taskTypes.Any()) { return; } var tasks = taskTypes.Select(t => (IPipelineTaskAsync <TPipelineMessage>)_factory.GetPipelineHandler(t)).ToList(); for (var i = 0; i < tasks.Count - 1; i++) { var thisTask = tasks[i]; var nextTask = tasks[i + 1]; thisTask.Setup(nextTask.Run); } // Noop last task tasks.Last().Setup(m => Task.FromResult(0)); // Run pipeline await tasks.First().Run(message).ConfigureAwait(false); }
public void GetPipelineTasks(PipelineBuilderAsync <FooBarPipelineMessage> builder) { builder.Add <FooBarPipelineTaskFooAsync>(); builder.Add <FooBarPipelineTaskBarAsync>(); }
public void GetPipelineTasks(PipelineBuilderAsync <MultiplePipelineMessage> builder) { }
public void GetPipelineTasks(PipelineBuilderAsync <EmptyPipelineMessage> builder) { }