/// <summary>
        /// Initializes a new instance of the <see cref="SwaggerEndPointProvider"/> class.
        /// </summary>
        /// <param name="swaggerEndPoints">The swagger end points.</param>
        public SwaggerEndPointProvider(
            IOptions <List <SwaggerEndPointOptions> > swaggerEndPoints,
            OcelotSwaggerGenOptions options)
        {
            _swaggerEndPointsOptions = Check.NotNull(swaggerEndPoints, nameof(swaggerEndPoints));

            _swaggerEndPoints = new Lazy <Dictionary <string, SwaggerEndPointOptions> >(Init);
            _options          = options;
        }
 private static void AddGatewayItSelfDocs(SwaggerGenOptions c, OcelotSwaggerGenOptions options)
 {
     if (options.GenerateDocsForGatewayItSelf)
     {
         c.SwaggerDoc(OcelotSwaggerGenOptions.GatewayKey, new OpenApiInfo
         {
             Title   = "Gateway",
             Version = OcelotSwaggerGenOptions.GatewayKey,
         });
     }
 }
 private static void AddAggregatesDocs(SwaggerGenOptions c, OcelotSwaggerGenOptions options)
 {
     if (options.GenerateDocsForAggregates)
     {
         c.SwaggerDoc(OcelotSwaggerGenOptions.AggregatesKey, new OpenApiInfo
         {
             Title   = "Aggregates",
             Version = OcelotSwaggerGenOptions.AggregatesKey
         });
         c.DocumentFilter <AggregatesDocumentFilter>();
     }
 }
        private static void AddGatewayItSelfDocs(SwaggerGenOptions c, OcelotSwaggerGenOptions options)
        {
            if (options.GenerateDocsForGatewayItSelf)
            {
                c.SwaggerDoc(OcelotSwaggerGenOptions.GatewayKey, new OpenApiInfo
                {
                    Title   = "Gateway",
                    Version = OcelotSwaggerGenOptions.GatewayKey,
                });

                if (options.OcelotGatewayItSelfSwaggerGenOptions is not null)
                {
                    AddDocumentFilterForGatewayItSelf(options.OcelotGatewayItSelfSwaggerGenOptions.DocumentFilterActions, c);
                    IncludeXmlComments(options.OcelotGatewayItSelfSwaggerGenOptions.FilePathsForXmlComments, c);
                }
            }
        }
        /// <summary>
        /// Adds configuration for for <see cref="SwaggerForOcelotMiddleware"/> into <see cref="IServiceCollection"/>.
        /// </summary>
        /// <param name="services">The services.</param>
        /// <param name="configuration">The configuration.</param>
        /// <param name="ocelotSwaggerSetup">Setup action for configraution thios package.</param>
        /// <param name="swaggerSetup">Setup acton for configuration of swagger generator.</param>
        /// <returns><see cref="IServiceCollection"/></returns>
        public static IServiceCollection AddSwaggerForOcelot(
            this IServiceCollection services,
            IConfiguration configuration,
            Action <OcelotSwaggerGenOptions> ocelotSwaggerSetup = null,
            Action <SwaggerGenOptions> swaggerSetup             = null)
        {
            services
            .AddTransient <IRoutesDocumentationProvider, RoutesDocumentationProvider>()
            .AddTransient <IDownstreamSwaggerDocsRepository, DownstreamSwaggerDocsRepository>()
            .AddTransient <ISwaggerServiceDiscoveryProvider, SwaggerServiceDiscoveryProvider>()
            .AddTransient <ISwaggerJsonTransformer, SwaggerJsonTransformer>()
            .Configure <List <RouteOptions> >(options => configuration.GetSection("Routes").Bind(options))
            .Configure <List <SwaggerEndPointOptions> >(options
                                                        => configuration.GetSection(SwaggerEndPointOptions.ConfigurationSectionName).Bind(options))
            .AddHttpClient()
            .AddMemoryCache()
            .AddSingleton <ISwaggerEndPointProvider, SwaggerEndPointProvider>();

            services.TryAddTransient <IAggregateRouteDocumentationGenerator, AggregateRouteDocumentationGenerator>();

            var options = new OcelotSwaggerGenOptions();

            ocelotSwaggerSetup?.Invoke(options);

            services.AddSingleton(options);
            services.AddSingleton(options.AggregateDocsGeneratorPostProcess);

            if (options.GenerateDocsForAggregates)
            {
                services.Configure <List <SwaggerAggregateRoute> >(options => configuration.GetSection("Aggregates").Bind(options));
            }

            services.AddSwaggerGen(c =>
            {
                swaggerSetup?.Invoke(c);

                AddAggregatesDocs(c, options);
                AddGatewayItSelfDocs(c, options);
            });

            return(services);
        }