private static IBrolicApplicationBuilder UseRegistrationSection(
            this IBrolicApplicationBuilder brolicApplicationBuilder, IDictionary <string, MiddlewareRegistration> middlewareRegistrations, string sectionKey)
        {
            var preMiddlewareRegistrations = middlewareRegistrations
                                             .Where(r => r.Key.Contains($"Pre{sectionKey}/"))
                                             .OrderBy(r => r.Value.Timestamp)
                                             .Select(r => r.Value);

            foreach (var preMiddlewareRegistration in preMiddlewareRegistrations)
            {
                brolicApplicationBuilder.UseRegistration(preMiddlewareRegistration);
            }

            brolicApplicationBuilder.UseRegistration(middlewareRegistrations[sectionKey]);

            var postMiddlewareRegistrations = middlewareRegistrations
                                              .Where(r => r.Key.Contains($"Post{sectionKey}/"))
                                              .OrderBy(r => r.Value.Timestamp)
                                              .Select(r => r.Value);

            foreach (var postMiddlewareRegistration in postMiddlewareRegistrations)
            {
                brolicApplicationBuilder.UseRegistration(postMiddlewareRegistration);
            }

            return(brolicApplicationBuilder);
        }
        public static IBrolicApplicationBuilder ConfigurePipeline(this IBrolicApplicationBuilder brolicApplicationBuilder, IBrolicApplicationConfiguration brolicApplicationConfiguration)
        {
            var middlewareRegistrations = brolicApplicationConfiguration.MiddlewareRegistrations;

            brolicApplicationBuilder
            .UseRegistrationSection(middlewareRegistrations, PipelineComponents.TrafficRouting)
            .UseRegistrationSection(middlewareRegistrations, PipelineComponents.DownstreamMatching)
            .UseRegistrationSection(middlewareRegistrations, PipelineComponents.TrafficDispatching);

            return(brolicApplicationBuilder);
        }
        private static IBrolicApplicationBuilder UseRegistration(
            this IBrolicApplicationBuilder brolicApplicationBuilder, MiddlewareRegistration middlewareRegistration)
        {
            switch (middlewareRegistration.Type)
            {
            case MiddlewareType.Delegate:
                brolicApplicationBuilder.Use(
                    middlewareRegistration.Middleware as Func <BrolicTrafficDelegate, BrolicTrafficDelegate>);
                break;

            case MiddlewareType.Class:
                brolicApplicationBuilder.UseMiddleware(middlewareRegistration.Middleware as Type, middlewareRegistration.Parameters);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            return(brolicApplicationBuilder);
        }